多線程02

多線程2

  • GCD隊列組:
  • 基本使用:
//0.創建隊列組
  dispatch_group_t group = dispatch_group_create();

  //1.創建隊列
  dispatch_queue_t queue  =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

  //2.添加任務
  //dispatch_async:1)封裝任務&2)提交任務到隊列
  //dispatch_group_async:1)封裝任務&2)提交任務到隊列&3)把當前的任務的執行情況納入到隊列組的監聽范圍中
  dispatch_group_async(group,queue, ^{
      NSLog(@"download1---%@",[NSThread currentThread]);
  });
  • 常用函數
 // 兩者配合使用,后面的異步任務被監聽
  dispatch_group_enter(group);
  dispatch_group_leave(group);
 // 當隊列中的任務執行完后執行block
 dispatch_group_notify(<#dispatch_group_t group#>, <#dispatch_queue_t queue#>, <#^(void)block#>)
 // 一直到前面的代碼塊都執行完,下面的代碼塊才執行
 dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
  • 隊列和組隊列的區別
  • 隊列:封裝任務,添加任務到隊列
  • 組隊列:封裝任務,添加任務到隊列,添加隊列到組
  • 單例模式設計:
  • 設計分析:
  //1.靜態變量
 static XMGTool *_instance;

 //2.重寫分配空間的方法(alloc會重寫allocWithZone方法)
 //alloc --->allocWithZone
 +(instancetype)allocWithZone:(struct _NSZone *)zone
 {

 //解決安全問題
 /*
 @synchronized(self) {
     if (_instance == nil) {
         _instance = [super allocWithZone:zone];
     }
 }
  */
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     _instance = [super allocWithZone:zone];
 });
 return _instance;
 }

 //3.提供類方法
 +(instancetype)shareXMGTool
 {
 return [[self alloc]init];
 }

 //4.嚴謹
 -(id)copyWithZone:(NSZone *)zone
 {
 return _instance;
 }

 -(id)mutableCopyWithZone:(NSZone *)zone
 {
 return _instance;
 }

  • NSOpreation認識學習:

  • 使用方法:

    • NSInvocationOperation方法:
    1.封裝操作
     NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download1) object:nil];
    2.開始操作
    [op1 start];
    
    • NSBlockOperation方法:
      //1.封裝操作
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"1---%@",[NSThread currentThread]);
    }];
     //追加操作
    //如果操作里面的任務數量大于一,那么會開子線程一起執行
    [op3 addExecutionBlock:^{
        NSLog(@"4---%@",[NSThread currentThread]);
    }];
      //2.開始操作
      [op1 start];
    
    • 自定義NSOpreation子類
  • 多圖下載案例總結:

  • 項目設計思路:框架搭建(XMGApp存放模型數據)->解決圖片重復下載問題(內存緩存->磁盤緩存)->界面運行卡頓問題解決(將圖片下載等耗時操作放到子線程中)->隊列重復創建問題(懶加載隊列)->數據錯亂問題解決(將每次下載的任務都添加到內存中,并在下一次下載的時候檢查內存是否有相應任務)->圖片不顯示問題解決(刷新每個cell)->cell重復使用(清空設置完的圖片或者設置占位圖片)

  • 框架搭建:省略

  • 圖片重復下載問題解決:

    1.檢查內存緩存中的圖片,并往內存緩存中設置圖片
    UIImage *image = [self.images objectForKey:appM.icon];
    [self.images setObject:image forKey:appM.icon];
    
    2.檢查磁盤緩存中的圖片,并往磁盤緩存中設置圖片
     NSString *cachesPath =[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,   NSUserDomainMask, YES) lastObject];
    //得到圖片的名稱
    NSString *filename = [appM.icon lastPathComponent];
    //拼接文件的全路徑
    NSString *fullPath = [cachesPath stringByAppendingPathComponent:filename];
    //去檢查磁盤緩存
    NSData *data = [NSData dataWithContentsOfFile:fullPath];
    //把圖片保存到磁盤緩存(圖片不能直接寫入file中,需要變為二進制數據)
    [data writeToFile:fullPath atomically:YES];
    
  • 界面運行卡頓問題解決:

```objc
將下載任務放到子線程中
NSBlockOperation dowbloadOperation = [NSBlockOperation blockOperationWithBlock:^{
  ......
            }];
[self.queue addOperation:dowbloadOperation];
```
  • 隊列重復創建問題解決:
```objc
-(NSOperationQueue *)queue

{
if (_queue == nil) {
_queue = [[NSOperationQueue alloc]init];
_queue.maxConcurrentOperationCount = 5;
}
return _queue;
}
```

  • 數據錯亂問題解決:
1.懶加載任務字典,存放任務
-(NSMutableDictionary *)operations
{
 if (_operations == nil) {
     _operations = [NSMutableDictionary dictionary];
 }
 return _operations;
}
2.檢查操作緩存
  NSBlockOperation *dowbloadOperation = [self.operations objectForKey:appM.icon];
3.添加操作到緩存中
  [self.operations setObject:dowbloadOperation forKey:appM.icon];
  • 圖片不顯示問題解決:
```objc
//設置圖片([tableView reloadData];刷新整個tableView cell.imageView.image = image;storyboard中的cell中imageView尺寸默認為0)
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
 //刷新指定的行
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
                }];
```
  • cell復用問題解決:
```objc
//清空圖片或者是設置占位圖片
 cell.imageView.image = [UIImage imageNamed:@"Snip20200808_172"];
```
  • 項目運行報錯(超時或找不到圖片):
if (image == nil) {
     //把操作從操作緩存中移除
      [self.operations removeObjectForKey:appM.icon];
      return ;
   }
  • 內存警告問題解決:
    -(void)didReceiveMemoryWarning
    

{
//移除內存緩存
[self.images removeAllObjects];

//取消隊列中的操作
[self.queue cancelAllOperations];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 826評論 0 3
  • 在這篇文章中,我將為你整理一下 iOS 開發中幾種多線程方案,以及其使用方法和注意事項。當然也會給出幾種多線程的案...
    張戰威ican閱讀 610評論 0 0
  • 進程和線程 首先,在了解多線程之前要了解什么是進程,什么是線程 什么是進程呢?進程是指在系統中正在運行的一個應用程...
    擱淺的青蛙閱讀 376評論 0 0
  • 前言: 第一次接觸多線程還是在寫android的時候,咋一看,覺得這玩意好難(面試必問);其實從字眼上看多線程分為...
    張無忌_閱讀 167評論 0 0
  • 2013年 ¥37900 2014年 ¥43300
    麥田牧羊者閱讀 116評論 0 0