五.GCDの高速反復

2778 ワード

GCDの高速反復
  • は通常、forループまたはwhileループを使用して巡回します.
  • しかし、通常のループは、メインスレッドで実行する
  • である.
  • ループ数が多すぎるとメインスレッドの実行に影響し、UIインタフェースのカートンを招き、ユーザーの体験を低下させる
  • .
  • GCD高速反復(遍歴)
  • フォーマット:dispatch_apply(, , )+:反復を行う回数+:反復実行キュー+:反復を行うコード、blockにインデックスiを設定して反復
  • を制御することに注意
  • 反復の注意点
  • 高速反復はサブスレッドを使用してプライマリ・タスクを実行するが、プライマリ・スレッドも反復タスクに参加するが、呼び出される頻度はプライマリ・スレッドが実行するタスク
  • に影響を与えるには十分ではない.
  • プライマリ・キュー列は使用できないことに注意してください.プライマリ・スレッドも反復に関与するため、プライマリ・キュー列とプライマリ・スレッドとの間のデッドロック
  • が発生します.
  • が実行する順序は、固定された
  • ではない.
  • シリアルキューを使用すると、すべてのタスクがプライマリ・スレッドで実行され、高速反復は意味がありません.
      2016-05-26 22:49:22.528 01-GCD     [44885:6079060] 0-----{number = 1, name = main}
      2016-05-26 22:49:22.528 01-GCD     [44885:6079200] 1-----{number = 2, name = (null)}
      2016-05-26 22:49:22.528 01-GCD     [44885:6079206] 3-----{number = 4, name = (null)}
      2016-05-26 22:49:22.528 01-GCD     [44885:6079201] 2-----{number = 3, name = (null)}
      2016-05-26 22:49:22.529 01-GCD     [44885:6079060] 4-----{number = 1, name = main}
      2016-05-26 22:49:22.529 01-GCD     [44885:6079200] 5-----{number = 2, name = (null)}
      2016-05-26 22:49:22.530 01-GCD     [44885:6079060] 8-----{number = 1, name = main}
      2016-05-26 22:49:22.529 01-GCD     [44885:6079206] 6-----{number = 4, name = (null)}
      2016-05-26 22:49:22.530 01-GCD     [44885:6079201] 7-----{number = 3, name = (null)}
      2016-05-26 22:49:22.530 01-GCD     [44885:6079200] 9-----{number = 2, name = (null)}
    
  • 高速反復の例:フォルダの内容を別のフォルダ
     - (void)cutImage {
         // 1.       
         NSString *fromPath = @"/Users/fanghe/Desktop/111";
         
         // 2.       
         NSString *toPath = @"/Users/fanghe/Desktop/222";
         
         // 3.     ,          
         NSArray *fileArray = [[NSFileManager defaultManager] subpathsAtPath:fromPath];
         NSLog(@"%@", fileArray);
         
         // 4.     
         dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);
         
         // 5.            
         dispatch_apply(fileArray.count, queue, ^(size_t i) {
             
             // 6.               
             NSString *fullFromPath = [fromPath stringByAppendingPathComponent:fileArray[i]];
             NSString *fullToPath = [toPath stringByAppendingPathComponent:fileArray[i]];
             
             // 7.     
             [[NSFileManager defaultManager] moveItemAtPath:fullFromPath toPath:fullToPath error:nil];
             NSLog(@"%@---%@---%@", fullFromPath, fullToPath, [NSThread currentThread]);
         });
     }
  • に切り取る