Objective-C的NSOperation多线程类基本使用指南

2020-01-14 19:04:47王旭

- (void)downloadFinishWithImage:(UIImage *)image;  
@end  
DownloadOperation.m
复制代码
#import "DownloadOperation.h"  
  
@implementation DownloadOperation  
@synthesize delegate = _delegate;  
@synthesize imageUrl = _imageUrl;  
  
// 初始化  
- (id)initWithUrl:(NSString *)url delegate:(id<DownloadOperationDelegate>)delegate {  
    if (self = [super init]) {  
        self.imageUrl = url;  
        self.delegate = delegate;  
    }  
    return self;  
}  
// 释放内存  
- (void)dealloc {  
    [super dealloc];  
    [_delegate release];  
    [_imageUrl release];  
}  
  
// 执行主任务  
- (void)main {  
    // 新建一个自动释放池,如果是异步执行操作,那么将无法访问到主线程的自动释放池  
    @autoreleasepool {  
        // ....  
    }  
}  
@end  
2> 正确响应取消事件
operation开始执行之后,会一直执行任务直到完成,或者显式地取消操作。取消可能发生在任何时候,甚至在operation执行之前。尽管NSOperation提供了一个方法,让应用取消一个操作,但是识别出取消事件则是我们自己的事情。如果operation直接终止, 可能无法回收所有已分配的内存或资源。因此operation对象需要检测取消事件,并优雅地退出执行
NSOperation对象需要定期地调用isCancelled方法检测操作是否已经被取消,如果返回YES(表示已取消),则立即退出执行。不管是自定义NSOperation子类,还是使用系统提供的两个具体子类,都需要支持取消。isCancelled方法本身非常轻量,可以频繁地调用而不产生大的性能损失
以下地方可能需要调用isCancelled:
* 在执行任何实际的工作之前