麦子学院 2016-06-18 22:46
多线程GCD有哪些常用的函数
回复:0 查看:3016
可能很多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
线程间的通信
从子线程回到主线程
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