NSOperation/NSOperationQueue 配合使用费,开启线程! OC的框
基于 GCD ! 更加面向对象(oc),但GCD效率更高!
NSOperation : 封装了 GCD 中的"任务"!
NSOperationQueue : 封装了 GCD 中的"队列"!
// 1.实例化操作对象
NSInvocationOperation *op1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(test1)object:nil];
NSInvocationOperation *op2 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(test2)object:nil];
NSInvocationOperation *op3 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(test3)object:nil];
// 2. 创建队列
NSOperationQueue *queue = [[NSOperationQueuealloc] init];
// 3. 将操作添加到非主队列中
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
// NSOperation执行方式2: 直接启动!直接在当前线程执行!
[op1 start];
[op2 start];
[op3 start];
NSBlockOperation
示例:
// 1.实例化 NSOperation子类对象
NSBlockOperation *op4 = [NSBlockOperationblockOperationWithBlock:^{
//
NSLog(@"耗时操作2------------");
}];
// NSOperationQueue
// 2.创建队列
NSOperationQueue *queue = [[NSOperationQueuealloc] init];
// NSOperation使用:将操作添加到队列中!
[queue addOperation:op4];
- (void)addExecutionBlock:(void (^)(void))block;
注意:只要NSBlockOperation封装的操作数>1,就会异步执行操作
- (void)addOperation:(NSOperation*)op;
- (void)addOperationWithBlock:(void (^)(void))block;
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cat;
队列的取消、暂停、恢复
- (void)cancelAllOperations;
提示:也可以调用NSOperation的- (void)cancel方法取消单个操作
- (void)setSuspended:(BOOL)b;//YES代表暂停队列,NO代表恢复队列
- (BOOL)isSuspended;
操作依赖
添加操作依赖的注意点:
// 1.不要添加循环依赖!以下这种写法是错误的
[op2 addDependency:op1];
[op1 addDependency:op2];
// 2. 一定要在将操作添加到操作队列中之前添加操作依赖!
// 优点:对于不同操作队列中的操作,操作依赖依然有效!
// 添加操作依赖!
[op2 addDependency:op1];
[op3 addDependency:op2];
[op4 addDependency:op3];
@implementation WTDownloadOperation
// 重写 NSOperation的 main 方法!
// 当把自定义的操作添加到操作队列中,或者直接调用操作的 start 方法之后,都会自动来执行 main方法中的内容!
-(void)main
{
// 为了能够及时释放内存,一般会手动书写一个 autoreleasepool!苹果官方文档不要求写!
@autoreleasepool {
UIImage *image = [selfdownloadWebImageWithUrlString:@"图片地址"];
// 回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
// 显示图片
self.imageView.image = image;
});
}
}
// 下载网络图片的方法
- (UIImage *)downloadWebImageWithUrlString:(NSString *)urlString
{
NSURL *url = [NSURLURLWithString:urlString];
// 下载方法!耗时方法!
NSData *data = [NSDatadataWithContentsOfURL:url];
UIImage *image = [UIImageimageWithData:data];
return image;
}
@end