iOS技术点技术贴程序员

NSOperation和NSOperationQueue

2016-04-14  本文已影响284人  LuxDark

简介

一、队列及操作
二、基本使用步骤
三、demo
(1) NSInvocationOperation(调度操作)
- (void) invocationOpertion
{
//定义队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//定义操作并添加到队列
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operatioAction) object:nil];
[queue addOperation:op];
}

- (void) operatioAction
{
NSLog(@"今天是个好日子!=====%@",[NSThread currentThread]);
}

输出:

2016-04-14 16:41:04.659 OperationTest[28735:1426089] 今天是个好日子!=====<NSThread: 0x7fc7a870b1e0>{number = 2, name = (null)}

总结:可以看出,开启了一个新线程。NSInvocationOperation优点:可以传一个参数,但是需要一个被调度的方法。

(2)NSBlockOperation(块操作)
- (void) blockOperation
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"今天是个好日子=====%@", [NSThread currentThread]);
}];
[queue addOperation:op];
}

总结:块操作比较灵活,代码都在一起,方便使用,方便阅读。

(3)设置操作的依赖关系(addDependency)
- (void) addDependency
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"下载图片1=====%@", [NSThread currentThread]);
}];

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"下载图片2=====%@", [NSThread currentThread]);
}];

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"下载图片3=====%@", [NSThread currentThread]);
}];
[op2 addDependency:op1];
[op3 addDependency:op2];
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
}

输出:

2016-04-14 16:51:41.513 OperationTest[28894:1433850] 下载图片1=====<NSThread: 0x7fa7027045f0>{number = 2, name = (null)}
2016-04-14 16:51:41.515 OperationTest[28894:1433863] 下载图片2=====<NSThread: 0x7fa70241d6c0>{number = 3, name = (null)}
2016-04-14 16:51:41.515 OperationTest[28894:1433863] 下载图片3=====<NSThread: 0x7fa70241d6c0>{number = 3, name = (null)}

总结:添加依赖关系,可以设置操作的执行顺序,否则执行的结果是无序的。但是注意不要出现循环依赖。

(4)设置同时并发的线程数量
- (void) maxCurrentOperation
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:2];
for (int i = 0; i<10; i++) {
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"你好====%@", [NSThread currentThread]);
    }];
    
    [queue addOperation:op];
}
}

优点:设置同时并发线程的数量可以有效的降低CPU的负担和内存开销。


从本质上来看,操作队列的性能会比GCD略低,不过,大多数情况下这点负面影响可以忽略不计,操作队列是并发编程的首选工具。AFN底层就是用的GCD开发,开发的接口是NSOperation。
今天的介绍就到这里,欢迎大家吐槽。

上一篇下一篇

猜你喜欢

热点阅读