ios如何獲取圖片(二)無沙盒下 解決問題 解決問題1:tableView滑動卡頓,圖片延時載入 解決方法:添加非同步請求,在子線程里請求網路,在主線程刷新UI 解決問題2:反覆請求網路圖片,增加用戶流量消耗 解決方法:創建了downloadImage,downloadImage屬於數據源,當tabl
ios如何獲取圖片(二)無沙盒下
解決問題
*解決問題1:tableView滑動卡頓,圖片延時載入
解決方法:添加非同步請求,在子線程里請求網路,在主線程刷新UI
*解決問題2:反覆請求網路圖片,增加用戶流量消耗
解決方法:創建了downloadImage,downloadImage屬於數據源,當tableview滾動的時候就可以給cell的數據賦值,運用了MVC設計方式
*解決問題3:當沒有請求到圖片時,留白影響用戶體驗,圖片還會延時刷新
解決方法:添加預設圖片
*解決問題4:當該cell的網路請求未執行完,又滾動到了該cell,會導致網路請求重覆
解決方法:創建網路請求緩衝池
*解決問題5:當出現數量較多的圖片時,防止記憶體使用過多,耦合性大
解決方法:創建圖片緩衝池
代碼如下圖
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
SXTShopCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];
SXTShop * shop = self.dataList[indexPath.row];
cell.shop = shop;
//為了避免重覆載入的問題,創建了downloadImage,downloadImage屬於數據源,當tableview滾動的時候就可以給cell的數據賦值
//從圖片緩衝池裡找到對應的圖片
if ([self.imageCache objectForKey:shop.shop_image]) {
//如果下載過,直接從記憶體中獲取圖片
cell.iconView.image = shop.downloadImage;
cell.iconView.image = self.imageCache[shop.shop_image];
} else {
//設置預設圖片
cell.iconView.image = [UIImage imageNamed:@"defaultImage"];
[self downloadImage:indexPath];
}
return cell;
}
- (void)downloadImage:(NSIndexPath *)indexPath {
SXTShop * shop = self.dataList[indexPath.row];
if ([self.operationDict objectForKey:shop.shop_image]) {
NSLog(@"已經請求過了,請等待下載");
} else {
//如果未下載過,開啟非同步線程
NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
//模擬網路延時
[NSThread sleepForTimeInterval:1];
//通過url獲取網路數據
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",baseUrl,shop.shop_image]]];
//將數據裝換為圖片
UIImage * image = [UIImage imageWithData:data];
//如果有圖片
if (image) {
//通知model,將圖片賦值給downloadImage,以便下次從記憶體獲取
// shop.downloadImage = image;
//將圖片作為value,將url作為key
[self.imageCache setObject:image forKey:shop.shop_image];
//獲取主隊列,更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//刷新第indexPath單元的表格
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}];
}
}];
//將請求加入操作緩衝池中
[self.operationDict setObject:op forKey:shop.shop_image];
//將請求加入全局隊列
[self.queue addOperation:op];
}
}
//當記憶體發生警報時,調用
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
[self.imageCache removeAllObjects];
[self.operationDict removeAllObjects];
[self.queue cancelAllOperations];
}