GCD的快速迭代
-
通常我们进行遍历, 都是使用的for循环或者while循环
- 但是, 普通的循环, 是在主线程中执行的
- 如果循环次数过多的话, 就会影响主线程的执行, 会导致UI界面的卡顿, 从而降低用户的体验
-
GCD快速迭代(遍历)
格式:
dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t queue#>, <#^(size_t)block#>)
+ <#size_t iterations#>: 进行迭代的次数
+ <#dispatch_queue_t queue#>: 迭代执行的队列
+ <#^(size_t)block#>: 进行迭代的代码, 注意要在block中设置一个索引i, 用来控制迭代-
迭代的注意点
虽然快速迭代会使用子线程来进行主要任务, 但是主线程也会参与到迭代任务当中, 但是调用的频率不足以影响主线程执行他的任务
注意不能使用主队列, 由于主线程也会参与迭代, 这样会造成主队列与主线程之间的死锁
执行的顺序不是固定的
-
如果使用了串行队列, 那么所有的任务都将会在主线程中进行, 这样快速迭代就没有任何的意义了
2016-05-26 22:49:22.528 01-GCD的快速迭代[44885:6079060] 0-----<NSThread: 0x7fc452f049b0>{number = 1, name = main} 2016-05-26 22:49:22.528 01-GCD的快速迭代[44885:6079200] 1-----<NSThread: 0x7fc452c02980>{number = 2, name = (null)} 2016-05-26 22:49:22.528 01-GCD的快速迭代[44885:6079206] 3-----<NSThread: 0x7fc452c05b70>{number = 4, name = (null)} 2016-05-26 22:49:22.528 01-GCD的快速迭代[44885:6079201] 2-----<NSThread: 0x7fc452c09dc0>{number = 3, name = (null)} 2016-05-26 22:49:22.529 01-GCD的快速迭代[44885:6079060] 4-----<NSThread: 0x7fc452f049b0>{number = 1, name = main} 2016-05-26 22:49:22.529 01-GCD的快速迭代[44885:6079200] 5-----<NSThread: 0x7fc452c02980>{number = 2, name = (null)} 2016-05-26 22:49:22.530 01-GCD的快速迭代[44885:6079060] 8-----<NSThread: 0x7fc452f049b0>{number = 1, name = main} 2016-05-26 22:49:22.529 01-GCD的快速迭代[44885:6079206] 6-----<NSThread: 0x7fc452c05b70>{number = 4, name = (null)} 2016-05-26 22:49:22.530 01-GCD的快速迭代[44885:6079201] 7-----<NSThread: 0x7fc452c09dc0>{number = 3, name = (null)} 2016-05-26 22:49:22.530 01-GCD的快速迭代[44885:6079200] 9-----<NSThread: 0x7fc452c02980>{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]); }); }