Как найти и отменить задачу в NSURLSession?
Я использую объект NSURLSession
для загрузки изображений в приложение. Это может быть загрузка нескольких изображений одновременно.
В некоторые моменты мне нужно отменить загрузку одного конкретного изображения и продолжить загрузку других.
Не могли бы вы предложить правильный способ сделать это?
Ответы
Ответ 1
Чтобы получить список задач, вы можете использовать метод NSURLSession
- (void)getTasksWithCompletionHandler:(void (^)(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks))completionHandler;
Асинхронно вызывает обратный вызов завершения со всеми выдающимися данными, загружать и загружать задачи в сеансе.
Затем проверьте task.originalRequest.URL
на возвращаемые задачи, чтобы найти тот, который вы хотите отменить.
Ответ 2
Надежды ниже справочной системы.
-(IBAction)cancelUpload:(id)sender {
if (_uploadTask.state == NSURLSessionTaskStateRunning) {
[_uploadTask cancel];
}
}
Ответ 3
Swift 3.0 версия ответа @Avt, чтобы получить список задач. Используйте getTasksWithCompletionHandler.
func getTasksWithCompletionHandler(_ completionHandler: @escaping ([URLSessionDataTask],
[URLSessionUploadTask],
[URLSessionDownloadTask]) -> Void) {
}
Возвращенные массивы содержат любые задачи, которые вы создали в сессии, не считая каких-либо задач, которые были признаны недействительными после завершение, отказ или отмена.
Ответ 4
Я предлагаю два метода:
- Поместите список
NSURLSessionTask
в массив. Если вы точно не знаете, сколько изображений вы получите. Хотя вам нужно знать индекс сессии, чтобы отменить его.
- Если вы получаете ограниченное количество изображений. Просто используйте набор
NSURLSessionTask
в качестве глобальных переменных, чтобы вы могли получить доступ, чтобы отменить его в любом месте своего класса.
Ответ 5
Я думаю, вы должны это сделать...
Во-первых, отслеживайте свои запросы за 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()
}
}
Ответ 6
Основываясь на всех ответах ниже, я бы пошел на что-то вроде этого:
Swift 5
func cancelTaskWithUrl(_ url: URL) {
URLSession.shared.getAllTasks { tasks in
tasks
.filter { $0.state == .running }
.filter { $0.originalRequest?.url == url }.first?
.cancel()
}
}
Вы также, вероятно, хотите учесть свой обработчик завершения задачи, так как отмена задачи приведет к Error
в этом обработчике завершения.
Ответ 7
Вы можете просто сохранить URL-адреса, которые вы начали загружать DataTasks, поэтому, когда вы хотите отменить один из запросов, получите загрузку URLSessionDataTask с помощью следующего кода:
getVideoFromUrl = session.dataTask(with: "Your URL Here")
getVideoFromUrl?.cancel()
и отмените URLSessionDataTask следующим образом:)