1、简介
1.NSOperation是基于GCD的
2.NSOperation结合NSOperationQueue使用,实现多线程编程
3.NSOperation是个抽象类,不具备封装操作的功能
4.NSOperation必须使用它的子类NSBlockOperation或NSInvocationOperation,以及自定义NSOperation
2、NSOperation、NSOperationQueue使用步骤
1.创建NSOperation对象,封装操作,操作就是需要执行的任务
2.创建NSOperationQueue队列
3.将NSOperation对象添加到NSOperationQueue队列中
4.系统自动将队列中的操作取出来,放到一条新的线程中执行
3、NSBlockOperation
NSBlockOperation *operation01 = [NSBlockOperation blockOperationWithBlock:^{ // 具体的操作 }]; NSBlockOperation *operation02 = [NSBlockOperation blockOperationWithBlock:^{ // 具体的操作 }]; // 2.创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 3.将多个操作添加到队列 // 只要NSBlockOperation封装的操作数大于1,就会异步执行 [queue addOperation:operation01]; [queue addOperation:operation02];
4、NSInvocationOperation
// 1.创建NSInvocationOperation对象 // 以self的run方法作为线程的执行体,参数为nil NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil]; // 2.创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 3.将操作添加到队列 [queue addOperation:operation];
5、自定义NSOperation子类
// 第01步:继承NSOperation @interface CustomNSOperation : NSOperation // 自定义方法 - (void)customMethod; @end // 第02步 自定义方法内封装操作 - (void)customMethod { // 具体的操作 } // 第03步 创建子类对象 CustomNSOperation *operation = [[CustomNSOperation alloc] init]; // 第04步 创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 第05步 操作添加到队列 [queue addOperation:operation];
6、队列的其他操作
// 任务的最大并发数 - (NSInteger)maxConcurrentOperationCount; - (void)setMaxConcurrentOperationCount:(NSInteger)cnt; // 队列中操作的取消 // 取消单个操作 - (void)cancel; // 取消所有操作 - (void)cancelAllOperations; // 队列的暂停与恢复 // YES:暂停 NO:恢复 - (BOOL)isSuspended; - (void)setSuspended:(BOOL)b; // 队列中操作优先级 - (NSOperationQueuePriority)queuePriority; - (void)setQueuePriority:(NSOperationQueuePriority)p; // 操作是否执行完毕 - (void (^)(void))completionBlock; - (void)setCompletionBlock:(void (^)(void))block; // 操作间的依赖关系 // 不能相互依赖 // 操作B依赖操作A,即A执行完后,才能执行B [operationB addDependency:operationA];