【问题标题】:Cancel NSData initWithContentsOfURL in NSOperation在 NSOperation 中取消 NSData initWithContentsOfURL
【发布时间】:2012-02-02 17:53:37
【问题描述】:

我目前在具有 keyPath "isCancelled" 观察者的 NSOperation 中有以下代码:

    downloaded = FALSE;
    NSURL *url = [NSURL URLWithString:requestString];
    dataXML = [[NSData alloc] initWithContentsOfURL:url];
    downloaded = TRUE;

我想让observeValueForKeyPath 函数能够取消继续执行的dataXML,或者在向NSOperation 发送取消消息后完全停止NSOperation。 NSOperation 的取消操作 cancel 只是通知操作它应该停止,但不会强制我的操作代码停止。

【问题讨论】:

    标签: ios nsdata nsoperation


    【解决方案1】:

    你不能取消它。

    如果您希望能够在中途取消加载,请使用在异步模式下运行的NSURLConnection。设置工作量更大,但您可以在下载过程中的任何时候取消。

    或者,您可以使用 this handy class 我写的将异步 NSURLConnection 及其委托包装在单个方法调用中;-)

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [[RequestQueue mainQueue] addRequest:request completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    
        if (data && error == nil)
        {
            //do something with your downloaded data
        }
    }];
    
    //to cancel the download at any time, just say
    [[RequestQueue mainQueue] cancelRequest:request];
    

    简单!

    </shamelessSelfPromotion>

    请注意,上面的请求已经是异步的,并且该类已经管理了多个请求的排队,因此您不需要(也不应该)将其包装在 NSOperationQueue 中。

    【讨论】:

    • 这是有道理的,但是一旦下载完成,没有什么能阻止您从成功块内部启动一个单独的 XML 操作。我的意思是你不应该在你的 NSOperatiom 中自己做请求,因为从另一个线程中产生一个线程只是浪费资源。尽管如果您愿意,可以在为每个 NSOperation 创建一个新的 RequestQueue 实例时记录日志,因为 mainQueue 共享实例不是线程安全的。
    • 谢谢!!!!你的代码真的帮助了我:我有将近 500mb(老实说)大小的 TIFF,现在我可以取消错误启动的加载!太棒了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多