2012-02-02 33 views
1

我现在有在一个对的keyPath“isCancelled”进行观察的的NSOperation下面的代码:取消的NSData initWithContentsOfURL中的NSOperation

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

我想让它,以便observeValueForKeyPath功能能够取消dataXML一旦NSOperation发送取消消息,继续或完全停止NSOperation。 NSOperation的取消操作取消只会通知操作它应该停止,但不会强制我的操作的代码停止。

回答

7

您不能取消它。

如果您希望能够在中途取消负载,请使用以异步模式运行的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包裹。

+0

这很有道理,但是一旦下载完成,没有什么能够阻止您从成功块内部单独执行XML操作。我的意思是你不应该在你的NSOperatiom中自己做请求,因为从另一个线程中产生一个线程只是浪费资源。虽然如果你愿意,可以像日志一样为每个NSOperation创建一个新的RequestQueue实例,因为mainQueue共享实例不是线程安全的。 – 2012-02-02 18:31:11

+0

谢谢!!!!你的代码真的帮了我很大的忙:我有TIFF的尺寸接近500MB(老实说),现在我可以取消错误启动的加载!辉煌。 – Todd 2012-11-26 22:31:47