iOS中用GCD和NSOperation多个异步操作的关联

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中用GCD和NSOperation多个异步操作的关联相关的知识,希望对你有一定的参考价值。

  在ios实际开发中,我们可能会遇到下面的场景:有以下四个操作A,B,C,D.要求A,B,C在子线程中执行,当A,B,C执行完毕之后回到主线程执行操作D,ABC之间可能会有相互依赖的关系,我们可以通过GCD和NSOperation都可以实现这样的需求.

1.GCD   

 

// 用GCD
- (void)useGCD
{
    // 1.1可以创建一个全局并发队列,A,B,C操作会在子线程中并发执行,ABC不存在先后执行顺序
//    dispatch_queue_t quque=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 1.2也可以可以创建一个串行队列,A,B,C操作会在子线程中串行执行,A-B-C依次执行
    dispatch_queue_t quque=dispatch_queue_create("com.hzsy.www", 0);

    // 2.创建一个队列组
    dispatch_group_t group=dispatch_group_create();
    
    // 3.进入队列组
    dispatch_group_enter(group);
    
    // 4.向队列组中添加队列并异步执行
    dispatch_group_async(group, quque, ^{
        NSLog(@"A--begain-%@",[NSThread currentThread]);
        NSLog(@"A--end-%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, quque, ^{
        NSLog(@"B--begain-%@",[NSThread currentThread]);
        NSLog(@"B--end-%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, quque, ^{
        NSLog(@"C--begain-%@",[NSThread currentThread]);
        NSLog(@"C--end-%@",[NSThread currentThread]);
    });
    
    // 5.当队列组中的操作执行结束后回到主线程执行操作D
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"D--finished-%@",[NSThread currentThread]);
    });
    
    // 6.离开队列组
    dispatch_group_leave(group);
    
    /*
        全局并发队列打印结果:
     2016-05-22 21:36:58.518 GCD和NSOpration[797:144336] A--begain-<NSThread: 0x15c51f170>{number = 2, name = (null)}
     2016-05-22 21:36:58.525 GCD和NSOpration[797:144335] B--begain-<NSThread: 0x15c556a90>{number = 3, name = (null)}
     2016-05-22 21:36:58.525 GCD和NSOpration[797:144338] C--begain-<NSThread: 0x15c54ac90>{number = 4, name = (null)}
     2016-05-22 21:36:58.525 GCD和NSOpration[797:144336] A--end-<NSThread: 0x15c51f170>{number = 2, name = (null)}
     2016-05-22 21:36:58.525 GCD和NSOpration[797:144335] B--end-<NSThread: 0x15c556a90>{number = 3, name = (null)}
     2016-05-22 21:36:58.525 GCD和NSOpration[797:144338] C--end-<NSThread: 0x15c54ac90>{number = 4, name = (null)}
     2016-05-22 21:36:58.526 GCD和NSOpration[797:144001] D--finished-<NSThread: 0x15c50c380>{number = 1, name = main}
     */
    
    /*
        串行队列打印结果:
     2016-05-22 21:39:20.660 GCD和NSOpration[805:145035] A--begain-<NSThread: 0x15c599cd0>{number = 2, name = (null)}
     2016-05-22 21:39:20.670 GCD和NSOpration[805:145035] A--end-<NSThread: 0x15c599cd0>{number = 2, name = (null)}
     2016-05-22 21:39:20.670 GCD和NSOpration[805:145035] B--begain-<NSThread: 0x15c599cd0>{number = 2, name = (null)}
     2016-05-22 21:39:20.670 GCD和NSOpration[805:145035] B--end-<NSThread: 0x15c599cd0>{number = 2, name = (null)}
     2016-05-22 21:39:20.671 GCD和NSOpration[805:145035] C--begain-<NSThread: 0x15c599cd0>{number = 2, name = (null)}
     2016-05-22 21:39:20.671 GCD和NSOpration[805:145035] C--end-<NSThread: 0x15c599cd0>{number = 2, name = (null)}
     2016-05-22 21:39:20.671 GCD和NSOpration[805:145012] D--finished-<NSThread: 0x15c604ba0>{number = 1, name = main}
     */
}

 

2.NSOperationQueue  

 1 @interface ViewController ()
 2 @property (nonatomic, strong) NSOperationQueue *queue;
 3 @end
 4 
 5 @implementation ViewController
 6 
 7 - (void)viewDidLoad {
 8     [super viewDidLoad];
 9     NSOperationQueue *queue= [[NSOperationQueue alloc]init];
10     _queue=queue;
11 }
12 @end

 

// 用NSOperationQueue
- (void)useOperationQueue
{
    // 1.创建ABCD执行block
    void (^blockA)(void)=^(void){
        NSLog(@"A--begain-%@",[NSThread currentThread]);
        NSLog(@"A--end-%@",[NSThread currentThread]);
    };
    
    void (^blockB)(void)=^(void){
        NSLog(@"B--begain-%@",[NSThread currentThread]);
        NSLog(@"B--end-%@",[NSThread currentThread]);
    };
    
    void (^blockC)(void)=^(void){
        NSLog(@"C--begain-%@",[NSThread currentThread]);
        NSLog(@"C--end-%@",[NSThread currentThread]);
    };
    
    void (^blockD)(void)=^(void){
        NSLog(@"D--finished-%@",[NSThread currentThread]);
    };
    
    // 2.创建ABCD的NSBlockOperation操作block
    NSBlockOperation *opA=[NSBlockOperation blockOperationWithBlock:blockA];
    NSBlockOperation *opB=[NSBlockOperation blockOperationWithBlock:blockB];
    NSBlockOperation *opC=[NSBlockOperation blockOperationWithBlock:blockC];
    NSBlockOperation *opD=[NSBlockOperation blockOperationWithBlock:blockD];
    
    // 3.1设置D操作的依赖
    [opD addDependency:opA];
    [opD addDependency:opB];
    [opD addDependency:opC];
    
    // 3.2设置ABC之间的依赖,如果不设置的话ABC将并发执行
    [opB addDependency:opA];
    [opC addDependency:opB];
    
    // 4.添加ABC操作到队列
    [_queue addOperation:opA];
    [_queue addOperation:opB];
    [_queue addOperation:opC];
    
    //5.添加D到主队列
    [[NSOperationQueue mainQueue] addOperation:opD];
    /*
        设置ABC之间的依赖执行结果执行结果:
     2016-05-22 21:55:29.114 GCD和NSOpration[828:148402] A--begain-<NSThread: 0x147556cc0>{number = 2, name = (null)}
     2016-05-22 21:55:29.127 GCD和NSOpration[828:148402] A--end-<NSThread: 0x147556cc0>{number = 2, name = (null)}
     2016-05-22 21:55:29.128 GCD和NSOpration[828:148402] B--begain-<NSThread: 0x147556cc0>{number = 2, name = (null)}
     2016-05-22 21:55:29.128 GCD和NSOpration[828:148402] B--end-<NSThread: 0x147556cc0>{number = 2, name = (null)}
     2016-05-22 21:55:29.130 GCD和NSOpration[828:148402] C--begain-<NSThread: 0x147556cc0>{number = 2, name = (null)}
     2016-05-22 21:55:29.130 GCD和NSOpration[828:148402] C--end-<NSThread: 0x147556cc0>{number = 2, name = (null)}
     2016-05-22 21:55:29.130 GCD和NSOpration[828:148377] D--finished-<NSThread: 0x14750c3e0>{number = 1, name = main}
     
     */
    /*
        不设置ABC之间的依赖执行结果:
     2016-05-22 21:56:44.480 GCD和NSOpration[833:148926] A--begain-<NSThread: 0x1265a3730>{number = 2, name = (null)}
     2016-05-22 21:56:44.480 GCD和NSOpration[833:148929] B--begain-<NSThread: 0x12658f4a0>{number = 3, name = (null)}
     2016-05-22 21:56:44.480 GCD和NSOpration[833:148927] C--begain-<NSThread: 0x1265a2ea0>{number = 4, name = (null)}
     2016-05-22 21:56:44.484 GCD和NSOpration[833:148926] A--end-<NSThread: 0x1265a3730>{number = 2, name = (null)}
     2016-05-22 21:56:44.485 GCD和NSOpration[833:148929] B--end-<NSThread: 0x12658f4a0>{number = 3, name = (null)}
     2016-05-22 21:56:44.485 GCD和NSOpration[833:148927] C--end-<NSThread: 0x1265a2ea0>{number = 4, name = (null)}
     2016-05-22 21:56:44.485 GCD和NSOpration[833:148902] D--finished-<NSThread: 0x12650c3c0>{number = 1, name = main}
     */
    
}

从上面的打印结果可以看到ABC之间如果设置了依赖关系,只会创建一条子线程.如果不设置会创建多条子线程.

 

 

 

 

 

---恢复内容结束---

以上是关于iOS中用GCD和NSOperation多个异步操作的关联的主要内容,如果未能解决你的问题,请参考以下文章

iOS多线程——GCD与NSOperation总结

GCD的同步异步串行并行NSOperation和NSOperationQueue一级用dispatch_once实现单例

NSOperation的进阶使用和简单探讨

iOS开发-NSOperation与GCD区别

iOS开发-NSOperation与GCD区别

Ios 多线程之NSOperation与NSOprationQueue