本期内容:
- iOS开发中从其他线程回到主线程的方法
- dispatch_group_create 组的概念
- dispatch_sync同步调度主线程会死锁的原因
- 项目中什么时候选择GCD什么时候选择NSOperation
- NSOperation 线程依赖的简单例子
- GCD的计时器和延时执行
- 简单说说线程死锁和线程安全⭐️
iOS开发中从其他线程回到主线程的方法
在开发中我们经常使用简单的多线程,用来让数据和视图更好分配来提高项目的性能。一般在调用其他线程和自己创建的线程完成数据的加载以及处理之后,我们需要回到主线程来更新我们的UI视图,该怎么做呢?其实很简单,以下三种方式都可以回到主线程来执行任务:
- (void)backToMainThread{
// 方法1,可以直接使用NSThread
[self performSelectorOnMainThread:@selector(dosomething:) withObject:nil waitUntilDone:NO];
[self performSelectorOnMainThread:@selector(dosomething:) withObject:nil waitUntilDone:NO modes:nil];
// 方法2,在使用GCD的时候,可以直接在线程中使用
dispatch_async(dispatch_get_main_queue(), ^{
// 使用异步线程获取主线程,如果在同步线程获取主线程,会阻塞线程
// 关于为什么会阻塞线程,下面会仔细讲解
[self dosomething:nil];
});
// 方法3,使用NSOperationQueue
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// NSOperationQueue有类方法,直接获取就可以使用了
[self dosomething:nil];
}];
}
- (void)dosomething:(id)sender{
NSLog(@"dosomething");
}
dispatch_group_create 组的概念
dispatch_group_create 有一个组的概念,可以把相关的任务归并到一个组内来执行
dispatch_group_async把异步任务提交到指定任务组和指定下拿出队列执行
参数有:
dispatch_group_enter
dispatch_group_leave
dispatch_group_wait
前两个要成对使用,wait会阻塞线程,等enter和leave执行完才会结束阻塞
dispatch_group_notify 待任务组执行完毕时调用,不会阻塞当前线程
因为下划线在MACDOWN语言中是斜体所以使用代码块来表述,以下来看看Group的使用:
- (void)downLoadImage{
// 创建全局队列
dispatch_queue_t imageDownLoadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 把全局队列添加到异步线程里面
dispatch_async(imageDownLoadQueue, ^{
// 使用分组执行下载人物
// 创建一个组
dispatch_group_t imageGroup =dispatch_group_create();
// 添加接收图片的数据对象
//__block UIImage *image1 = nil;
//__block UIImage *image2 = nil;
//__block UIImage *image3 = nil;
//__block UIImage *image4 = nil;
// 在组里面创建异步任务
dispatch_group_async(imageGroup, dispatch_get_global_queue<