博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C-NSOperation
阅读量:6176 次
发布时间:2019-06-21

本文共 3285 字,大约阅读时间需要 10 分钟。

hot3.png

NSOpseration是抽象基类,所以要用子类实现它的方法。(内部使用gcd实现)

1.一个NSOperation 就代表一个任务,任务的代码分装在block里或者函数里。
    OC提供子类:
        NSInvocztionOperation:任务是一个函数,比较长
        NSBlockOperation:任务是一个block,比较短

常用方法demo:(有关线程执行方式,队列类型看)

1.1NSBlockOperation:

- (void) testBlockOperation2{    //情况1.    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"startA:%@", [NSThread currentThread]);    }];    [operationA start];    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"startB:%@", [NSThread currentThread]);    }];    [operationB start];    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"startC:%@", [NSThread currentThread]);    }];    [operationC start];        //情况2.    NSBlockOperation *operation = [[ NSBlockOperation alloc] init];    [operation addExecutionBlock:^{        NSLog(@"start1:%@", [NSThread currentThread]);    }];        [operation addExecutionBlock:^{        NSLog(@"start2:%@", [NSThread currentThread]);    }];    [operation addExecutionBlock:^{        NSLog(@"start3:%@", [NSThread currentThread]);    }];    [operation start];}

135352_Yyzi_2391617.png

可以看到任务配置好以后,直接执行时同步的。而把任务block放到一起的时候是异步的。

- (void) testBlockOperation{    //情况3.    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"start1:%@", [NSThread currentThread]);    }];        NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"start2:%@", [NSThread currentThread]);    }];        NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"start3:%@", [NSThread currentThread]);    }];        NSOperationQueue *queue = [[NSOperationQueue alloc] init];    [queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];}

135849_oIx8_2391617.png

放到全局队列里也是异步的(并发),如果放到主队列([NSOperationQueue mainQueue])里,那么是同步的。


1.2NSInvocztionOperation:使用它和NSBlockOperation是一样的。都是NSOperation的子类……

- (void) testOperationInvocation{    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationFirst:) object:@"start"];    [operation1 start];        NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationFirst:) object:@"newQ"];    [queue addOperation:operation2];}- (void) operationFirst:(NSString *) who{    NSLog(@"\n%@, %s, %@", who, __func__, [NSThread currentThread]);}

2.任务间依赖关系:也是用来实现异步线程间通信的一种约定

- (void) operationDependency{    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"thread 1");    }];    [operation1 setCompletionBlock:^{        NSLog(@"finish thread1");    }];    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"thread 2");    }];    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"thread 3");    }];        [operation1 addDependency:operation2];    [operation2 addDependency:operation3];        NSOperationQueue *queue = [[NSOperationQueue alloc] init];    [queue addOperation:operation1];    [queue addOperation:operation2];    [queue addOperation:operation3];}

140757_OCUA_2391617.png依据依赖顺序执行

转载于:https://my.oschina.net/changzhongwei/blog/630293

你可能感兴趣的文章
懒汉式单例
查看>>
java递归组装树形结构
查看>>
手把手教你自己写一个模糊搜索的下拉框
查看>>
.Net文档图像处理工具包GdPicture.NET发布v14.0.30,改进PDF/OCR生成速度
查看>>
NetBSD 8.1 RC1 发布
查看>>
12个必备的JavaScript装逼技巧
查看>>
域名备案图文教程
查看>>
iOS ScrollView上的view添加悬停效果
查看>>
Spring与MQ整合简单例子
查看>>
Apache-shiro学习
查看>>
React-Redux源码分析
查看>>
页面传递参数问题
查看>>
PHP FPM源代码反刍品味之五:信号signal处理
查看>>
5G网速真的有理论上那么高吗?
查看>>
Set添加自定义方法对象如何保证唯一性
查看>>
站在巨人肩膀上的牛顿:Kubernetes和SAP Kyma
查看>>
技术工坊|浅谈区块链的Layer2扩展(北京)
查看>>
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
查看>>
Apache和PHP结合 及 Apache默认虚拟主机
查看>>
添加自定义监控项目配置邮件告警测试告警不发邮件的问题处理
查看>>