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

Ros*_*nko 15 networking objective-c ios nsurlsession

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

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

你能建议正确的方法吗?

Avt*_*Avt 29

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

- (void)getTasksWithCompletionHandler:(void (^)(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks))completionHandler;
Run Code Online (Sandbox Code Playgroud)

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

然后检查task.originalRequest.URL返回的任务以找到要取消的任务.


小智 6

希望下面的代码帮助.

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


ino*_*key 6

根据下面的所有答案,我会选择这样的:

斯威夫特 5

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

您可能还想考虑您的任务完成处理程序,因为取消任务将导致Error该完成处理程序。

  • 感谢您的建议@inokey。`.filter { $0.state == .running }` 可以省略。由于文档说“传递给完成处理程序的数组包含您在会话中创建的任何任务,不包括完成、失败或取消后已失效的任何任务。” (3认同)

ped*_*uan 5

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

func getTasksWithCompletionHandler(_ completionHandler: @escaping ([URLSessionDataTask], 
   [URLSessionUploadTask], 
   [URLSessionDownloadTask]) -> Void) {     
}
Run Code Online (Sandbox Code Playgroud)

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


Nho*_*yen 1

我建议两种方法:

  1. 将 的列表放入NSURLSessionTask数组中。如果您不知道具体会获得多少张图像。尽管您必须知道会话索引才能取消它。
  2. 如果您获得的图像数量有限。只需使用一组NSURLSessionTask全局变量,这样您就可以在类中的任何位置取消它。