Swift
编程
Swift51.com
首页
社区
▼
资讯
问答
分享
建议
开源代码
Xcode下载
Swift教程
hot
登录
注册
当前位置:
首页
> 分享
欢迎加入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
取消引用
您还未登录,
请先登录
提 问
热门帖子
iDev 全平台开发者大会门票免费送!限量10张!
苹果Mac Pro垃圾桶 最低配的ME253CH
本人想买个苹果电脑搞开发,哪位大侠指点下
求助:failable initializer 'init(name:)' cannot override a non-failable initializer
为庆祝Swift发布1个月,雨燕社区正式上线。
在UITextFeild里输入数据,这个数据怎么做加减乘除?
Swift 高仿喜马拉雅FM
要成为自由职业者?先要学会苹果的Swift哦
用swift实现的调用系统相机,相册的DEMO
关于嵌入式引用\()
Swift 教程
最新帖子
swift_5.3可以更新了
swift如何实现左滑删除
IBM Swift Sandbox访问
Thread 18: Fatal error: 'try!' expression unexpectedly raised an error: Error
跟随手势滑动的ScrollableTextField
Swift5.0什么时候出
什么时候出5.0
PerfectTemplate 无法编译
WWDC19 苹果宣布全新 UI 框架 SwiftUI
水平滚动视图Carousel
Xcode 9.4下载