iOS如何取消正在执行的操作

一、系统的取消方法

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]);
        }];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容