欢迎加入QQ讨论群258996829
麦子学院 头像
苹果6袋
6
麦子学院

多线程GCD有哪些常用的函数

发布时间:2016-06-18 22:46  回复:0  查看:3008   最后回复:2016-06-18 22:46  
可能很多iOS小白对iOS多线程函数比较迷惑,别着急,这里给大家列举了几个最常用的 iOS多线程 函数,希望对大家有所帮助。

线程间的通信
从子线程回到主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  //执行耗时的异步操作
  dispatch_async(dispatch_get_main_queue(), ^{        
      //回到主线程刷新UI
  });
});

延时执行

iOS常见的延时执行有两种方式
p 调用NSObject的方法
[self performSelector:@selector(run:) withObject:nil afterDelay:2.0];

p 使用GCD函数
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      //2秒后异执行这里的代码
  });

一次性代码

使用dispatch_once函数能保证某段代码在执行过程中只被执行一次

static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{

      //只执行一次的代码(这里默认是线程安全的)
  });


dispatch_barrier_async (栅栏函数)

dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);


dispatch_barrier_async的作用是在并行队列中,插入其中,就会有等到其前面的线程执行完毕,然后执行自己的线程,再执行其后面的线程。起到一个栅栏的作用


示例代码 

- (void)barrier
{
  dispatch_queue_t queue = dispatch_queue_create("12312312", DISPATCH_QUEUE_CONCURRENT);

  dispatch_async(queue, ^{
      NSLog(@"----1-----%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"----2-----%@", [NSThread currentThread]);
  });

  dispatch_barrier_async(queue, ^{
      NSLog(@"----barrier-----%@", [NSThread currentThread]);
  });

  dispatch_async(queue, ^{
      NSLog(@"----3-----%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"----4-----%@", [NSThread currentThread]);
  });
}

dispatch_apply()

方法
void
dispatch_apply(size_t iterations, dispatch_queue_t queue,
void (^block)(size_t));

参数
iterations     执行的次数
  queue        提交到的队列
  block        执行的任务
  size_t       传当前索引


功能
p 把一项任务提交到队列中多次执行,具体是并行执行还是串行执行由队列本身决定.注意,dispatch_apply不会立刻返回,在执行完毕后才会返回,是同步的调用。
p 它可以起到快速迭代的作用,类似于for循环的遍历,但for循环的遍历是一个一个执行的,而dispatch_apply是几乎同时执行的


示例代码

/**
* 快速迭代
*/
- (void)apply
{
  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  NSString *from = @"/Users/shenzhouguangda/Desktop/icon";
  NSString *to = @"/Users/shenzhouguangda/Desktop/icon1";

  NSFileManager *mgr = [NSFileManager defaultManager];
  NSArray *subpaths = [mgr subpathsAtPath:from];

  dispatch_apply(subpaths.count, queue, ^(size_t index) {
      NSString *subpath = subpaths[index];
      NSString *fromFullpath = [from stringByAppendingPathComponent:subpath];
      NSString *toFullpath = [to stringByAppendingPathComponent:subpath];
      // 剪切
      [mgr moveItemAtPath:fromFullpath toPath:toFullpath error:nil];

      NSLog(@"%@---%@", [NSThread currentThread], subpath);
  });
}

队列组


有这么一种需求
p 首先:分别异步执行两个耗时操作
p 其次:等两个异步操作都执行完毕后,再回到主线程执行操作


如果想要快速高效的实现上述需求,可以考虑用队列组

dispatch_group_t group = dispatch_group_create();

  dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //执行一个耗时操作
  });

  dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //执行一个耗时操作

  });

  dispatch_group_notify(group, dispatch_get_main_queue(), ^{

      //等到前面的异步操作都执行完毕后,回到主线程。
  });

原文来自:简书/一抹月光3053
您还未登录,请先登录

热门帖子

最新帖子