ios线程依赖的处理方式

在iOS开发中,我们经常会用到一个线程需要等待另一个结束才能进行的需求,这种需求其实有很实用的解决办法.下面我将列举一些目前用到的两种方式.

一.GCD

强大的GCD我们经常会使用到,它的功能网上已经有很多教程,这里就不一一赘述了,直接上代码:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

for(inti  =0; i <10000; i++) {

//just for delayed}NSLog(@"dispatch semaphore send");

dispatch_semaphore_signal(semaphore);

});

NSLog(@"waiting...");

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

控制台的打印是:

waiting...dispatchsemaphoresend

这里需要注意的是,

dispatch_semaphore_signal(semaphore)

这个方法必须要在另一个线程中调用.

而且,

dispatch_semaphore_wait()

方法一定不能在主线程中调用,因为一不小心就会阻塞当前线程,造成主线程卡死.

二.NSBlockOperation

直接上代码:

NSOperationQueue *queue= [[NSOperationQueue alloc] init];

NSBlockOperation * op1 = [NSBlockOperation blockOperationWithBlock:^{

 for(inti =0; i <1000; i++) {

 }

 NSLog(@"op1 is finish");

}];

NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{

for(inti =0; i <1000000; i++) {

}

NSLog(@"op2 is finish");

}];

[op1 addDependency:op2];

[queueaddOperation:op1];

[queueaddOperation:op2];

控制台打印的是:

2016-09-23 18:09:07.377 op2 is finish

2016-09-23 18:09:07.378 op1 is finish

可以看出op1添加依赖之后,op2首先打印完毕,然后打印op1.

小结

这就是目前常用的两种处理线程依赖的方式,很简单,但是往往能解决大麻烦.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. NSOperation、NSOperationQueue 简介 NSOperation、NSOperatio...
    稻春阅读 872评论 0 0
  • NSThread 第一种:通过NSThread的对象方法 NSThread *thread = [[NSThrea...
    攻城狮GG阅读 853评论 0 3
  • 一、为什么要用 当我们在写程序的时候,我们通常会遇到一些很费时的一些操作。比如离线下载、本地数据的存储等等,在做这...
    Go丶Pikachu阅读 217评论 0 1
  • 进程和线程 首先,在了解多线程之前要了解什么是进程,什么是线程 什么是进程呢?进程是指在系统中正在运行的一个应用程...
    搁浅的青蛙阅读 403评论 0 0
  • 为避免多线程同时争夺一块资源,将加锁、资源争夺的逻辑交给服务器端处理,减少移动端的压力 并发(concurrenc...
    一代骄马阅读 228评论 0 0