如何在NSURLSession中查找和取消任务?

时间:2014-05-07 13:05:41

标签: ios objective-c networking nsurlsession

我使用NSURLSession对象在我的应用程序中加载图像。这可能是同时加载几个图像。

在某些时刻,我需要取消加载一个特定图像并继续加载其他图像。

你能建议正确的方法吗?

6 个答案:

答案 0 :(得分:29)

要获取任务列表,您可以使用NSURLSession的方法

- (void)getTasksWithCompletionHandler:(void (^)(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks))completionHandler;
  

异步调用包含所有未完成数据的完成回调,   上传,并在会话中下载任务。

然后检查task.originalRequest.URL是否找到了要取消的任务。

答案 1 :(得分:5)

希望下面的代码帮助。

-(IBAction)cancelUpload:(id)sender {    
    if (_uploadTask.state == NSURLSessionTaskStateRunning) {
        [_uploadTask cancel];
     }
  }

答案 2 :(得分:3)

Swift 3.0 @ Avt 获取任务列表的答案。使用getTasksWithCompletionHandler

Append
  

返回的数组包含您在其中创建的任何任务   会话,不包括之后失效的任何任务   完成,失败或被取消。

答案 3 :(得分:1)

我建议使用两种方法:

  1. NSURLSessionTask列表放入数组中。如果你不确切知道你会得到多少图像。虽然您必须知道会话索引才能取消它。
  2. 如果您获得的图片数量有限。只需使用一组NSURLSessionTask作为全局变量,这样您就可以在课堂的任何地方取消它。

答案 4 :(得分:1)

基于下面的所有答案,我会选择这样的东西:

快速5

 func cancelTaskWithUrl(_ url: URL) {
    URLSession.shared.getAllTasks { tasks in
      tasks
        .filter { $0.state == .running }
        .filter { $0.originalRequest?.url == url }.first?
        .cancel()
    }
  }

您还可能要考虑您的任务完成处理程序,因为取消任务将在该完成处理程序中产生Error

答案 5 :(得分:0)

我认为你应该这样做......

首先,跟踪每个xib的请求

var download_requests = [NSURLSession]()

然后,每当您提出请求时,请将您的请求附加到您的数组中,

let s = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
if let url = NSURL(string: "http://my.url.request.com")
{
  download_requests.append(s)
  s.dataTaskWithURL(url)
  { (data, resp, error) -> Void in
    // ....
  }
}

然后,只要你想取消任何未完成的请求,(比如说在viewDidDisappear上),请执行

  override func viewDidDisappear(animated: Bool)
  {
    super.viewDidDisappear(animated)
    //stop all download requests
    for request in download_requests
    {
      request.invalidateAndCancel()
    }
  }