ios 几种线程依赖的处理方式

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

一.GCD

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

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int i  = 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...
dispatch semaphore send

这里需要注意的是,

dispatch_semaphore_signal(semaphore)

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

dispatch_semaphore_wait()

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

二.NSBlockOperation

直接上代码:

    NSOperationQueue * queue = [[NSOperationQueue alloc] init];
    NSBlockOperation * op1 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 1000; i++) {

        }
        NSLog(@"op1 is finish");
    }];
    NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 1000000; i++) {

        }
        NSLog(@"op2 is finish");
    }];
    [op1 addDependency:op2];
    [queue addOperation:op1];
    [queue addOperation: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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值