iOS 同一頁面載入上百張圖片,迅速滑動時導致記憶體暴漲程式崩潰的參考解決方法
阿新 • • 發佈:2019-01-25
本例中專案大致流程是先由客戶端拍照或者選擇相簿中的圖片進行上傳,然後可以從詳情頁面中瀏覽所有上傳的圖片,由於圖片是按照相簿進行分類,而每個相簿中最多可以有50張照片,極限的情況是詳情頁面最多可以有20多個相簿,由此導致需要對圖片的載入進行必要的優化,避免程式佔用記憶體過多導致程式崩潰
優化思路如下:
1、限制圖片快取佔用的最大記憶體數
設定SDWebImage中imageCache的setMaxMemoryCountLimit
[[SDWebImageManager sharedManager].imageCache setMaxMemoryCountLimit:15];
//imageCache為SDWebImageManager中的獨立快取單元
2、控制器檢視滑動開始時對圖片處理執行緒的監管,以及對圖片快取所佔用的記憶體的清理
在載入圖片的控制器中,當頁面開始滑動時暫停SDWebImage中所有任務的執行(取消掉當前所有的下載圖片的operation),並且清除記憶體中的圖片快取,再將滑動狀態結束的標誌位置為No,此標誌位用於載入圖片時的相關操作,即第4步操作
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
self.isEndDecelerating = NO;
NSLog(@"scrollViewWillBeginDragging-----" );
[SDWebImageManager.sharedManager cancelAll];
[SDWebImageManager.sharedManager.imageCache clearMemory];
}
3、控制器檢視滑動結束時對相簿的操作
控制器滑動結束時,將代表滑動結束的標誌位置為YES,並將檢視可見範圍內的相簿重新載入圖片
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
self.isEndDecelerating = YES;
NSLog(@"scrollViewDidEndDecelerating-----" );
NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *indexPath in visiblePaths) {
switch (indexPath.row) {
case 21:
{
HeadPhotoCell * cell = (HeadPhotoCell *)[self.tableView cellForRowAtIndexPath:indexPath];
[cell.album reloadData];
}
break;
...
...
default:
...
break;
}
}
}
4、載入圖片時的管理
載入圖片時,根據控制器檢視的滑動狀態選擇展示縮圖還是清除image,減小程式執行壓力
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
CDCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CDCollectionCell" forIndexPath:indexPath];
NSString * imgUrl = [self.totalArray objectAtIndex:indexPath.section][indexPath.row];
NSString * urlStr = [NSString stringWithFormat:@"%@/%@?width=30&height=30",ImageServerUrl,imgUrl];
if(self.parentViewCtrl.isEndDecelerating) {
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:urlStr]];
}else{
cell.imageView.image = nil;
}
return cell;
}
描述或解決不當之處,歡迎大家批評指正