在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.
小结
这就是目前常用的两种处理线程依赖的方式,很简单,但是往往能解决大麻烦.
网友评论