一) NSOperation使用方法:
NSOperation 实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。NSOperation在ios4后也基于GCD实现,但是相对于GCD来说可控性更强,并且可以加入操作依赖。NSOperation提供了ready, cancelled, executing, finished这几个状态变化,我们的开发也是必须处理自己关心的其中的状态。这些状态都是基于keypath的KVO通知决定,所以在你手动改变自己关心的状态时,请别忘了手动发送通知。这里面每个属性都是相互独立的,同时只可能有一个状态是YES。finished这个状态在操作完成后请及时设置为YES,因为NSOperationQueue所管理的队列中,只有isFinished为YES时才将其移除队列,这点在内存管理和避免死锁很关键。
1.NSInvocationOperation:
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil];
[op start];
//开始
[op cancel];
//取消
2 NSBlockOperation
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]); //处理线程的block方法
}];
3 NSOperationQueue
一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。一旦NSoperation添加到NSoperationQueue中,用户就无权对NSoperation管理,都有NSoperationQueue来执行。
3.1 添加一个队列
NSoperationQueue *myQueue = [[NSOperationQueue alloc]init];
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil];
[myQueue addOperation:op];
3.2 主队列(任何刷新UI的方法都必须在主队列中执行)
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//可以执行刷新UI控件的方法
}];
3.3 队列直接可以设置依赖,比如队列1需要队列2执行完毕后才能执行(addDependency)
NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
[block1 addDependency:block2];
[myQueue addOperation:block1];
[myQueue addOperation:block2];
3.4可以设置最大并发的操作数量
[myQueue setMaxConcurrentOperationCount:2];
3.5 一旦添加到队列,队列就拥有了这个Operation对象并且不能被 删除,唯一能做的事情是取消。
[myQueue cancelAllOperations];
3.6获取NSOperation
myQueue.operations 这是一个数组,里面存放这添加进入这个队列的所有任务
3.7 如果你想临时暂停Operations的执行,可以使用queue的setSuspended:方法暂停queue。
[myQueue setSuspended:YES];