Как найти и отменить задачу в 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 следующим образом:)