麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

iOS多線程-05-多圖下載

2019-11-14 18:26:59
字體:
來源:轉載
供稿:網友

效果圖


常見問題及解決方法


  • 圖片重復下載

    • 將內存保存在內存或沙盒中。
  • 若下載的圖片量較大,則會出現UI界面不流暢的現象

    • 在子線程中執行下載操作,然后回到主線程成中進行UI界面的刷新。
  • 由于cell的循環利用造成的圖片顯示錯亂問題

    • 指定刷新表格的indexPath行。
  • subTitle類型的cell,無法顯示圖片

    • subtitle類型的cell中的imageView只有在第一次返回cell時設置圖片,否則圖片將不能顯示(刷新表格也不行)。可以通過設置占位圖片的方式來解決此問題。

思維導圖


具體實現


  • 其核心代碼主要在tableView的返回創建cell的代理方法中,所以以下主要對該方法的實現進行解析

  • 主要流程

    • 設置模型類,包含以下屬性

      /**圖片*/@PRoperty (nonatomic, strong) NSString *icon;/**名字*/@property (nonatomic, strong) NSString *name;/**下載量*/@property (nonatomic, strong) NSString *download;
    • 需要用到的成員屬性

      /**模型數組,用來存放每個cell的數據模型*/@property (nonatomic, strong) NSArray *apps;/**操作隊列,操作只有添加到隊列才有可能并發執行*/@property (nonatomic, strong) NSOperationQueue *queue;/**用于在內存中緩存圖片,部分避免圖片被多次下載*/@property (nonatomic, strong) NSMutableDictionary *imageCache;/**標記當前所有正在執行的操作,避免正在執行的操作被重復執行*/@property (nonatomic, strong) NSMutableDictionary *operations;
    • 創建cell的方法的核心代碼

      • 從內存緩存中取圖片

        //內存中緩存的圖片在imagCache數組中self.imageCache[app.icon]
      • 從沙盒中取圖片

        //獲取文件路徑NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//獲取文件名NSString *filename = [app.icon lastPathComponent];//計算出全路徑NSString *file = [cachePath stringByAppendingPathComponent:filename];//加載沙盒中的數據NSData *data = [NSData dataWithContentsOfFile:file];//判斷data中若有數據,否則從網絡上下載數據if (data){//沙盒中有數據    UIImage *image = [UIImage imageWithData:data];    cell.imageView.image = image;    //存到字典中(即內存)    self.imageCache[app.icon] = cell.imageView.image;}
      • 從網絡上下載數據

        //若subTitle類型的cell要顯示圖片,必須在第一次放回cell時就顯示圖片(或占位圖片)cell.imageView.image = [UIImage imageNamed:@"1"];//取得操作隊列中的操作NSOperation *operation = self.operations[app.icon];if (operation == nil){//不存在該圖片的下載操作    //創建下載圖片操作    operation = [NSBlockOperation blockOperationWithBlock:^{        //通過url加載數據        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]];        //數據加載失敗        if (data == nil)        {            //移除操作,以便刷新表格時能夠再次請求數據            [self.operations removeObjectForKey:app.icon];            return ;        }        //NSData轉換為UIImage        UIImage *image = [UIImage imageWithData:data];        //存放到字典中        self.imageCache[app.icon] = image;        //線程睡眠,模擬大數據下載        [NSThread sleepForTimeInterval:1];        //回主線程顯示圖片        [[NSOperationQueue mainQueue] addOperationWithBlock:^{            //通過indexPath刷新表格,此時內存緩存中已有圖片            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];        }];        //將圖片寫入沙盒        [data writeToFile:file atomically:YES];        //移除操作,保證在刷新表格時可以重新下載沒有下載的圖片        [self.operations removeObjectForKey:app.icon];    }];    //將操作添加到隊列    [self.queue addOperation:operation];    //保證圖片不被重復下載    self.operations[app.icon] = operation;

通過第三方框架(SDWebImage)


  • SDWebImage可以大大簡化多圖下載任務
  • 通過擴展UIImageView的分類,在分類方法中實現多圖下載功能,只給外部使用者暴露一個簡單地網絡接口
  • 包含分類頭文件UIImageView+WebCache.h

  • 圖片下載功能的實現

    • 方法一

      - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder/**	 url:圖片的地址     placeholder:占位圖片*/
    • 方法二

      - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock/**	 progressBlock:下載過程中的回調Block,可以在該Block中計算下載進度	 completedBlock:下載完畢的回調方法*/

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九九热免费精品视频 | 久久精品一区二区三区国产主播 | 麻豆视频观看 | 精品国产91久久久久久久 | 9191色| 看一级大毛片 | 亚洲成人网一区 | 中文字幕一区二区三区四区 | 91九色电影 | 成人毛片网 | 羞羞羞羞视频 | 久久人添人人爽人人爽人人片av | 午夜在线视频一区二区三区 | 蜜桃精品视频 | 91午夜在线观看 | 欧美一级精品片在线看 | 黄污在线看 | 一级黄片毛片免费看 | 爱爱插插视频 | 成人激情久久 | 亚州综合网| 福利在线播放 | 天堂精品久久 | 一级大片一级一大片 | 黄色片一区二区 | 男女羞羞视频在线观看免费 | 精精国产xxxx视频在线野外 | 欧美亚洲另类在线 | 91精品国产91久久久久久不卞 | 国产一级二级毛片 | 久久久久免费电影 | 毛片免费视频播放 | 国产1区在线观看 | 国产精品视频yy9299一区 | 欧美 中文字幕 | 美国一级黄色毛片 | 一级毛片播放 | 国产在线地址 | 91网在线播放 | 国产精品久久久久久久久久三级 | 黄色网址在线播放 |