Миграция кода из NSURLConnection в NSURLSession [дубликат]

2017 ответ: теперь вы можете делать то, что хотите, в каждом текущем браузере и узле

. Это довольно просто:

  • Вернуть обещание
  • Используйте 'await' , в котором JavaScript ожидает, что обещание будет разрешено в vlue (например, hTTP-ответ)
  • Добавьте 'async' для родительской функции

Вот рабочая версия вашего кода:

(async function(){

var response = await superagent.get('...')
console.log(response)

})()

ожидание поддерживается во всех текущих браузерах и узлах 8 [/ д2]

15
задан user2747220 2 November 2014 в 01:10
поделиться

3 ответа

Интересно, что Apple конкретно объясняет это поведение в своих NSURLSessionDataDelegate (но ни в базовом делетете NSURLSessionTaskDelegate, ни в NSURLSessionDownloadDelegate)

ПРИМЕЧАНИЕ

Объект NSURLSession не должен иметь делегата. Если делегат не назначен, при создании задач в этом сеансе вы должны предоставить блок обработчика завершения для получения данных.

Блок обработчика завершения в основном предназначен как альтернатива использованию пользовательского делегата. Если вы создаете задачу с использованием метода, который принимает блок обработчика завершения, методы делегата для ответа и доставки данных не вызываются.

12
ответ дан Manfred Urban 24 August 2018 в 01:45
поделиться

Из моего тестирования вам нужно выбрать, хотите ли вы использовать делегат или обработчик завершения - если вы укажете оба, вызывается только обработчик завершения. Этот код дал мне текущие обновления и событие didFinishDownloadingToURL:

func downloadEpisodeWithFeedItem(episodeURL: NSURL) {
    let request: NSURLRequest = NSURLRequest(URL: episodeURL)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue.mainQueue())

    let downloadTask = session.downloadTaskWithURL(episodeURL)
    downloadTask.resume()
}

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {
    println("didResumeAtOffset: \(fileOffset)")
}

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
    var downloadProgress = Double(totalBytesWritten) / Double(totalBytesExpectedToWrite)
    println("downloadProgress: \(downloadProgress)")
}

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
    println("didFinishDownloadingToURL: \(location)")
    println(downloadTask)
}

Из NSURLSession документации , вот соответствующий раздел:

Как и большинство сетевых API, API NSURLSession отличается высокой асинхронностью. Он возвращает данные одним из двух способов, в зависимости от методов, которые вы вызываете:

  • К блоку обработчика завершения, который возвращает данные в ваше приложение, когда передача завершается успешно или с ошибкой.
  • Вызов методов вашего пользовательского делегата при получении данных.
  • Вызов методов в пользовательском делететете, когда загрузка в файл завершена.

Поэтому по дизайну он возвращает данные либо блоку обработчика завершения, либо делегату. Но, как показано здесь, не оба.

23
ответ дан Nate Cook 24 August 2018 в 01:45
поделиться

Swift 3

class ViewController: UIViewController {
    var urlLink: URL!
    var defaultSession: URLSession!
    var downloadTask: URLSessionDownloadTask!
}

// MARK: Button Pressed
    @IBAction func btnDownloadPressed(_ sender: UIButton) {
        let urlLink1 = URL.init(string: "https://github.com/VivekVithlani/QRCodeReader/archive/master.zip")
        startDownloading(url: urlLink!)
}
    @IBAction func btnResumePressed(_ sender: UIButton) {
    downloadTask.resume()
}

@IBAction func btnStopPressed(_ sender: UIButton) {
    downloadTask.cancel()
}

@IBAction func btnPausePressed(_ sender: UIButton) {
    downloadTask.suspend()
}

    func startDownloading (url:URL) {
        let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "backgroundSession")
        defaultSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)
        downloadProgress.setProgress(0.0, animated: false)
        downloadTask = defaultSession.downloadTask(with: urlLink)
        downloadTask.resume()
    }

// MARK:- URLSessionDownloadDelegate
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
    print("File download succesfully")
}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
    downloadProgress.setProgress(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite), animated: true)
}

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    downloadTask = nil
    downloadProgress.setProgress(0.0, animated: true)
    if (error != nil) {
        print("didCompleteWithError \(error?.localizedDescription)")
    }
    else {
        print("The task finished successfully")
    }
}
3
ответ дан Vivek 24 August 2018 в 01:45
поделиться