NSOperation和NSOperationQueue配合使用实现多线程编程。默认就是并发的。
具体实现步骤:
1、将任务封装到NSOperation对象中
2、将NSOperation对象添加到NSOperationQueue中
3、系统自动从NSOperationQueue中取出NSOperationNSOperation对象
4、将取出的任务放到一条新线程中执行
NSOperation是抽象类,不具有封装操作的能力,必须使用子类
有3种子类:
NSInvocationOperation
NSBlockOperation
自定义子类继承NSOperation,实现内部相应方法
NSInvocationOperation范例:
-(void)opDemo{
//创建操作
NSOperation *op = [[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(downloadImage:)
object:@"Invocation"];
//如果使用了start方法就会直接在当前线程执行任务
//[op start];
//创建队列
NSOperationQueue *q =[[NSOperationQueue alloc] init];
//把操作加入队列,自动异步执行调度方法
[q addOperation:op];
}
NSBlockOperation范例(多个任务):
-(void)opDemo
{
NSOperationQueue *q =[[NSOperationQueue alloc] init];
for(int i = 0; i < 10; i++){
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任务");
//[q addOperationWithBlock:^{}]方法可以更快捷地使用
}
[q addOperation:op];
}
}
//如果要做线程通信,可以用下面的方法拿到主队列,往其中加[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@”更新UI”);
}]
//最大并发数:并不是线程的最大数量,而是同时执行的操作的数量。
self.opQueue.maxConcurrentOperationCount =2;
//队列里的暂停继续(挂起):
self.opQueue.suspended =!self.opQueue.suspended;
//取消队列里的操作:
[self.opQueue cancelAllOperations];
//如果不做下面的操作,取消队列任务时并不会影响队列的挂起状态,可能会对后续的操作产生影响
self.opQueue.suspended = NO;