美文网首页iOS
ios线程依赖的处理方式

ios线程依赖的处理方式

作者: 胡子仙森 | 来源:发表于2017-04-12 00:23 被阅读116次

    在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.

    小结

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

    相关文章

      网友评论

      本文标题:ios线程依赖的处理方式

      本文链接:https://www.haomeiwen.com/subject/vcxinttx.html