我使用NSURLSession
对象在我的应用程序中加载图像。这可能是同时加载几个图像。
在某些时刻,我需要取消加载一个特定图像并继续加载其他图像。
你能建议正确的方法吗?
答案 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)
我建议使用两种方法:
NSURLSessionTask
列表放入数组中。如果你不确切知道你会得到多少图像。虽然您必须知道会话索引才能取消它。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()
}
}