GCD部分用法及遍歷方法

GCD

  • Dispatch_group:(異步執行,dispatch_group_notify監聽group執行完畢之后執行)
  dispatch_group_t downloadGroup = dispatch_group_create();
  for (int i = 1 ; i <= pageNum; i++) {
    dispatch_group_enter(downloadGroup);
    // 執行下載任務
      dispatch_group_leave(downloadGroup);
  }
  dispatch_group_notify(downloadGroup,     dispatch_get_main_queue(), ^{
    [activitingArray sortUsingDescriptors:[NSArray   arrayWithObject:[NSSortDescriptor   sortDescriptorWithKey:@"date" ascending:NO]]];
          [self.activeCV reloadData];
  });
  • Dispatch_after:延遲執行
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NO
W, (int64_t)(delayInSeconds * NSEC_PER_SEC)); // 1  
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
     // 主線程執行更新動作。
}); 
  • Dispatch_once:以線程安全的方式執行且僅執行其代碼塊一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedPhotoManager = [[PhotoManager alloc] init];
        sharedPhotoManager->_photosArray = [NSMutableArray array];
        sharedPhotoManager->_concurrentQueue = dispatch_queue_create(" ", DISPATCH_QUEUE_CONCURRENT);
    });
  • Dispatch_apply:并發執行不同迭代,相當于一個for循環,同步的。
dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) { 
        NSURL *url; 
        switch (i) { 
            case 0: 
                url = [NSURL URLWithString:edGirlfriendURLSting]; 
                break; 
            default: 
                break; 
        } 

遍歷方法

  • Dispatch_apply:異步執行,可以利用多核優勢
  • EnumerateObjecsWithOptions:異步執行,多核優勢,可以指定遍歷順序
    [imageArray enumerateObjectsWithOptions:NSEnumerationReverse
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"idx = %ld, id = %@", idx, obj);
    }];
  • EnumerateObjecsUsingBlock:不可指定遍歷順序
    [imageArray enumerateObjectsUsingBlock:^(id obj,
     NSUInteger idx, BOOL *stop) {
        NSLog(@"idx = %ld, id = %@", idx, obj);
    }];
  • For in (NSFastEnumeration):快速遍歷
  1. 對于集合中對象數很多的情況下,for in (NSFastEnumeration)的遍歷速度非常之快,但小規模的遍歷并不明顯(還沒普通for循環快)
  1. 使用kvc集合運算符運算很大規模的集合時,效率明顯下降(100萬的數組離譜的21秒多),同時占用了大量內存和cpu
  1. enumerateObjectsWithOptions(NSEnumerationConcurrent)dispatch_apply(Concurrent)的遍歷執行可以利用到多核cpu的優勢(實驗中在雙核cpu上效率基本上x2)
  1. 遍歷執行Block對于耗時的任務來說是很值得這么做的,而且在以后cpu升級成更多核心后不用改代碼也可以享受帶來的好處
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容