在NSOperation中取消NSData initWithContentsOfURL

时间:2012-02-02 17:53:37

标签: ios nsdata nsoperation

我目前在NSOperation中有以下代码,它有一个keyPath“isCancelled”的观察者:

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

我想这样做,以便在NSOperation发送取消消息后,observeValueForKeyPath函数能够取消dataXML继续或完全停止NSOperation。 NSOperation的取消操作取消仅通知操作它应该停止,但不会强制我的操作代码停止。

1 个答案:

答案 0 :(得分: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中。