NSOperation、NSOperationQueue
- (void)operationTS{ //NSOperation 单独使用时系统同步执行操作,配合 NSOperationQueue 我们能更好的实现异步执行。 /***************** NSInvocationOperation ********************/ NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task) object:nil]; [op start]; /******************** NSBlockOperation **********************/ //addExecutionBlock: 就可以为 NSBlockOperation 添加额外的操作。这些操作(包括 blockOperationWithBlock 中的操作)可以在不同的线程中同时(并发)执行 NSBlockOperation *blockOP = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"NSBlockOperation执行"); }]; [blockOP addExecutionBlock:^{ NSLog(@"NSBlockOperation额外添加任务1"); }]; [blockOP addExecutionBlock:^{ NSLog(@"NSBlockOperation额外添加任务2"); }]; [blockOP addExecutionBlock:^{ NSLog(@"NSBlockOperation额外添加任务3"); }]; [blockOP start]; /******************** NSOperation子类 **********************/ KZOperation *kzOP = [[KZOperation alloc]init]; [kzOP start]; } - (void)operationQueue{ /* 对于添加到队列中的操作,首先进入准备就绪的状态(就绪状态取决于操作之间的依赖关系),然后进入就绪状态的操作的开始执行顺序(非结束执行顺序)由操作之间相对的优先级决定(优先级是操作对象自身的属性) */ //主队列、自定义队列(串行、并发) //maxConcurrentOperationCount(6-max 默认-1) //可控制并发(开启线程数量是由系统决定)、串行 //主队列获取方法 NSOperationQueue *queueMain = [NSOperationQueue mainQueue]; //自定义队列创建方法 //添加到这种队列中的操作,就会自动放到子线程中执行。 //同时包含了:串行、并发功能。 NSOperationQueue *queueZi = [[NSOperationQueue alloc]init]; /**************** 操作加入到队列中 ********************/ //- (void)addOperation:(NSOperation *)op; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task) object:nil]; NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task) object:nil]; NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"任务3"); }]; [op3 addExecutionBlock:^{ NSLog(@"任务4"); }]; [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3]; //- (void)addOperationWithBlock:(void (^)(void))block; [queue addOperationWithBlock:^{ NSLog(@"任务5"); }]; /*************** queuePriority优先级 *************/ //仅适用于同一操作队列中的操作 /* 如果一个队列中既包含高优先级操作,又包含低优先级操作,并且两个操作都已经准备就绪,那么队列先执行高优先级操作。 如果,一个队列中既包含了准备就绪状态的操作,又包含了未准备就绪的操作,未准备就绪的操作优先级比准备就绪的操作优先级高。那么,虽然准备就绪的操作优先级低,也会优先执行。优先级不能取代依赖关系。如果要控制操作间的启动顺序,则必须使用依赖关系。 */ /****************** 线程间通信 *****************/ NSOperationQueue *queue001 = [[NSOperationQueue alloc]init]; [queue001 addOperationWithBlock:^{ NSLog(@"异步任务"); [[NSOperationQueue mainQueue]addOperationWithBlock:^{ NSLog(@"回到主线程"); }]; }]; /***************** 线程安全 *****************/ /* 可以给线程加锁,在一个线程执行该操作的时候,不允许其他线程进行操作。iOS 实现线程加锁有很多种方式。@synchronized、 NSLock、NSRecursiveLock、NSCondition、NSConditionLock、pthread_mutex、dispatch_semaphore、OSSpinLock、atomic(property) set/ge等等各种方式 */ /*************** NSOperation常用属性及方法归纳 *******************/ /* 取消操作方法 - (void)cancel; 可取消操作,实质是标记 isCancelled 状态。 判断操作状态方法 - (BOOL)isFinished; 判断操作是否已经结束。 - (BOOL)isCancelled; 判断操作是否已经标记为取消。 - (BOOL)isExecuting; 判断操作是否正在在运行。 - (BOOL)isReady; 判断操作是否处于准备就绪状态,这个值和操作的依赖关系相关。 操作同步 - (void)waitUntilFinished; 阻塞当前线程,直到该操作结束。可用于线程执行顺序的同步。 - (void)setCompletionBlock:(void (^)(void))block; completionBlock 会在当前操作执行完毕时执行 completionBlock。 - (void)addDependency:(NSOperation *)op; 添加依赖,使当前操作依赖于操作 op 的完成。 - (void)removeDependency:(NSOperation *)op; 移除依赖,取消当前操作对操作 op 的依赖。 @property (readonly, copy) NSArray<NSOperation *> *dependencies; 在当前操作开始执行之前完成执行的所有操作对象数组。 */ /************** NSOperationQueue 常用属性和方法 *****************/ /* 取消/暂停/恢复操作 - (void)cancelAllOperations; 可以取消队列的所有操作。 - (BOOL)isSuspended; 判断队列是否处于暂停状态。 YES 为暂停状态,NO 为恢复状态。 - (void)setSuspended:(BOOL)b; 可设置操作的暂停和恢复,YES 代表暂停队列,NO 代表恢复队列。 操作同步 - (void)waitUntilAllOperationsAreFinished; 阻塞当前线程,直到队列中的操作全部执行完毕。 添加/获取操作` - (void)addOperationWithBlock:(void (^)(void))block; 向队列中添加一个 NSBlockOperation 类型操作对象。 - (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait; 向队列中添加操作数组,wait 标志是否阻塞当前线程直到所有操作结束 - (NSArray *)operations; 当前在队列中的操作数组(某个操作执行结束后会自动从这个数组清除)。 - (NSUInteger)operationCount; 当前队列中的操作数。 获取队列 + (id)currentQueue; 获取当前队列,如果当前线程不是在 NSOperationQueue 上运行则返回 nil。 + (id)mainQueue; 获取主队列。 */ } - (void)task{ NSLog(@"任务执行"); }
创建继承自NSOperation的子类,并重写main方法
@interface KZOperation : NSOperation @end @implementation KZOperation - (void)main{ if (!self.isCancelled) { NSLog(@"KZOperation继承NSOperation"); } } @end