一:多线程间通信
多线程之间的通信可以体现在线程间数据的传递,或者是在某一个线程中完成操作之后转移到另一个线程继续操作
就IOS来说,最方便也最简洁的多线程方案当属GCD,其代码块简洁,可读性强,并且同样功能强大。我们可以通过
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0){
});
方法操作一个多线程,比如在此方法中下载一张图片,我们知道在子线程中获取图片之后需要返回主线程中刷新UI,这个时候就可以利用在子线程中获得的Image,给主线程的控件设置图片;
dispatch_async(dispatch_get_main_queue(), ^{[
[self.button setImage:image forState:UIControlStateNormal];
}):
二、多个线程控制
有的我们会遇到需要同时开辟多个线程完成工作,并且还需要监控到所有线程在什么时候都完成工作。
比如:当我们需要用三个线程去同时请求数据,当二个线程AB都请求到数据后,再到其他线程来操作数据。这个时候我就必须知道什么时候三个数据全部都拿到了,我们才能继续下一步的操作。
应对这种情况我们可以使用dispatch_group来控制。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程A
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程B
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 汇总结果
});
我们也可以通过用NSOpertion和NSOpertionQueue来处理这个问题
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建3个操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operationA---“);
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operationB---“);
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operationC---“);
}];
// 添加依赖
[c addDependency:a];
c在a執行完之後再執行
[c addDependency:b];
// 执行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];