美文网首页多线程
iOS如何取消正在执行的操作

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

作者: Frankkkkk | 来源:发表于2019-08-14 16:18 被阅读0次

    一、系统的取消方法

    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]);
            }];
        }
    }
    

    相关文章

      网友评论

        本文标题:iOS如何取消正在执行的操作

        本文链接:https://www.haomeiwen.com/subject/lzggjctx.html