一、系统的取消方法
NSOperationQueue
取消所有操作的方法:- (void)cancelAllOperations;
该方法的作用是:
- 取消所有操作--取消所有未执行的操作,正在执行的操作不会被取消。
- 调用该方法时,会给所有的操作发送
cancel
消息。根据这一点,我们可以用自定义操作类,来取消正在执行的操作!
二、解决方案,自定义NSOperation
1、查看NSOperation类的文档
先来看下官方对NSOperation
的定义
NS_CLASS_AVAILABLE(10_5, 2_0)
@interface NSOperation : NSObject {
@private
id _private;
int32_t _private1;
#if __LP64__
int32_t _private1b;
#endif
}
- (void)start;
- (void)main;
@property (readonly, getter=isCancelled) BOOL cancelled;
- (void)cancel;
API解释:
- 当把操作添加到队列时,会自动先执行
start
方法,再执行main
方法。 - 将线程对象添加到可调度线程池时,会调用
start
方法;在线程上执行程序,入口是main
函数,此时会调用main
函数。
2、自定义NSOperation类
- 1、自定义一个操作类,继承
NSOperation
类,以DownloadImageOperation
为例。 - 2、实现
main
方法,将要执行的异步操作都放到该方法中去实现 - 3、利用
isCancelled
属性,在关键的地方加判断,取消后面的操作
如下面代码所示:
- (void)main {
@autoreleasepool {
// 利用断言要求必须传入完成回调,简化后续代码的分支
NSAssert(self.finishedBlock != nil, @"必须传入回调 Block");
// 1. NSURL
NSURL *url = [NSURL URLWithString:self.URLString];
// 2. 获取二进制数据
NSData *data = [NSData dataWithContentsOfURL:url];
// 3. 保存至沙盒
if (data != nil) {
[data writeToFile:self.URLString.appendCachePath atomically:YES];
}
if (self.isCancelled) {
NSLog(@"下载操作被取消");
return;
}
// 主线程回调
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.finishedBlock([UIImage imageWithData:data]);
}];
}
}
网友评论