美文网首页
五. GCD的快速迭代

五. GCD的快速迭代

作者: 面糊 | 来源:发表于2016-05-26 22:50 被阅读267次

GCD的快速迭代

  1. 通常我们进行遍历, 都是使用的for循环或者while循环

    • 但是, 普通的循环, 是在主线程中执行的
    • 如果循环次数过多的话, 就会影响主线程的执行, 会导致UI界面的卡顿, 从而降低用户的体验
  2. GCD快速迭代(遍历)

    1. 格式:
      dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t queue#>, <#^(size_t)block#>)
      + <#size_t iterations#>: 进行迭代的次数
      + <#dispatch_queue_t queue#>: 迭代执行的队列
      + <#^(size_t)block#>: 进行迭代的代码, 注意要在block中设置一个索引i, 用来控制迭代

    2. 迭代的注意点

      • 虽然快速迭代会使用子线程来进行主要任务, 但是主线程也会参与到迭代任务当中, 但是调用的频率不足以影响主线程执行他的任务

      • 注意不能使用主队列, 由于主线程也会参与迭代, 这样会造成主队列与主线程之间的死锁

      • 执行的顺序不是固定的

      • 如果使用了串行队列, 那么所有的任务都将会在主线程中进行, 这样快速迭代就没有任何的意义了

          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)}
        
    3. 快速迭代的实例: 剪切文件夹中的内容到另一个文件夹

       - (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]);
           });
       }

相关文章

  • 五. GCD的快速迭代

    GCD的快速迭代 通常我们进行遍历, 都是使用的for循环或者while循环但是, 普通的循环, 是在主线程中执行...

  • GCD快速迭代

    普通for循环遍历数据 使用for循环遍历数据,是同步的, 串行的 GCD快速迭代: 开子线程和主线程一起完成遍历...

  • GCD的快速迭代

    GCD的快速迭代 通常我们进行遍历, 都是使用的for循环或者while循环 但是, 普通的循环, 是在主线程中执...

  • iOS面试--GCD常见用法

    项目中常见的GCD用法有已下几种: 1.GCD栅栏函数2.GCD快速迭代(遍历)3.GCD队列组的使用 1.GCD...

  • GCD-快速迭代

    /* 第一个参数:遍历的次数 第二个参数:队列(要使用并发队列,主队列会发生死锁,串行队列将无效果) ...

  • iOS GCD的快速迭代

    -(void)forDemo{//同步for(NSIntegeri =0; i<10; i++) {NSLog(@...

  • GCD

    GCD之dispatch_apply dispatch_apply的作用是快速迭代 dispatch_apply替...

  • GCD相关方法

    1.gcd栅栏函数 2.gcd快速迭代方法(dispatch_apply)同for循环做比较。 案例:将文件夹fr...

  • GCD 快速迭代 dispatch_apply

    dispatch_apply函数通常在并发队列中使用。 控制台输出: 这个函数真正使用场景暂时还没有遇到,暂时先搁...

  • iOS【数组常用的五种遍历方式】

    一、for循环 二、forin 快速枚举 三、NSEnumerator 四、快速遍历 五、快速迭代 总结:从这五种...

网友评论

      本文标题:五. GCD的快速迭代

      本文链接:https://www.haomeiwen.com/subject/xemxdttx.html