1.1、NSOperationQueue为我们提供两种队列,主队列和自定义队列,主队列运行在主线程上,自定义队列运行在后台线程上,
•在主队列添加任务时,需要调用star方法执行任务,否则无法执行任务(无法打印“111”);
不需要执行addOperation方法
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"111"); }];
[operation start];
•使用自定义队列,不需要调用start方法
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;//最大并发操作数,1为串行队列,不为1为并行队列,最大并发操作数不是最大开辟线程数,指的是能同时处理几个任务
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"operation1%@", [NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"operation2%@", [NSThread currentThread]);
}];
[queue addOperation:operation1];//添加任务到队列
[queue addOperation:operation2];
1.2、线程间的通信
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"111");
//回到主线程,刷新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
}];
}];
[queue addOperation:operation1];//添加任务到队列
1.3、 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 *dependencies;在当前操作开始执行之前完成执行的所有操作对象数组。
3.2 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;获取主队列。
注意:
这里的暂停和取消(包括操作的取消和队列的取消)并不代表可以将当前的操作立即取消,而是当当前的操作执行完毕之后不再执行新的操作。
暂停和取消的区别就在于:暂停操作之后还可以恢复操作,继续向下执行;而取消操作之后,所有的操作就清空了,无法再接着执行剩下的操作。
网友评论