Загрузите файл с NSURLSession в Swift

у меня здесь две проблемы, во-первых, я не могу установить NSURLSessionDownloadDelegate с быстрым проектом, компилятор говорит

Type 'ViewController' does not conform to protocol 'NSURLSessionDownloadDelegate'

Вторая проблема: я не могу найти методы NSURLSession для загрузки простого файла.

вот как я использую для загрузки простого файла

    var url:NSURL = NSURL.URLWithString(fileURL)
    var request:NSURLRequest = NSURLRequest(URL: url)
    var downloadTask:NSURLSessionDownloadTask = sessionManager.downloadTaskWithRequest(request)
    downloadTask.resume()

и это методы, которые я хочу сделать быстро

URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

..

URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location

..

URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

.. если есть новый способ загрузки файлов с помощью NSURLSession, я хотел бы знать, и что нового в NSURLSession в Swift


person Amr Mohamed    schedule 29.08.2014    source источник


Ответы (1)


В данный момент я работаю над проектом с фоновым диспетчером загрузок, и вот несколько вещей, как я это решил:

если вы используете NSURLSessionDownloadDelegate, вам необходимо реализовать следующие методы:

func URLSession(session: NSURLSession!, downloadTask: NSURLSessionDownloadTask!, didFinishDownloadingToURL location: NSURL!) 

func URLSession(session: NSURLSession!, downloadTask: NSURLSessionDownloadTask!, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) 

func URLSession(session: NSURLSession!, downloadTask: NSURLSessionDownloadTask!, didFinishDownloadingToURL location: NSURL!) 

Я сделал это с помощью этого вызова:

var session:NSURLSession!


    var sessionConfiguration:NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.company")
    sessionConfiguration.HTTPMaximumConnectionsPerHost = 5

    self.session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil)

// при загрузке

var downloadTask:NSURLSessionDownloadTask = self.session.downloadTaskWithURL(NSURL.URLWithString("urlfromyourfile"))
downloadTask.resume()

// при ошибке:

func URLSession(session: NSURLSession!, task: NSURLSessionTask!, didCompleteWithError error: NSError!) {

    if(error != nil) {

        println("Download completed with error: \(error.localizedDescription)");

    } else {

        println("Download finished successfully");

    }

}

Здесь вы найдете хороший учебник (я использовал много кода из этого учебника и написал его по-новому с помощью swift)

http://www.appcoda.com/background-transfer-service-ios7/< /а>

person derdida    schedule 29.08.2014
comment
Когда XCode сообщил вам об этой ошибке? - person derdida; 29.08.2014
comment
Раньше я добавлял делегатов сначала в obj-c, чтобы xcode автоматически завершал методы делегата, но здесь, в xcode 6, когда я устанавливаю это NSURLSessionDownloadDelegate, компилятор сообщает мне об этой ошибке, потому что я не писал методы делегатов, которые были инвертированы Я думаю ? - person Amr Mohamed; 29.08.2014
comment
Вы используете Swift и Obj-C в одном проекте? - person derdida; 29.08.2014
comment
нет, я обновляю свой проект obj-c до swift, это чистый быстрый проект - person Amr Mohamed; 29.08.2014
comment
Так ваша проблема все еще актуальна или нет? Пожалуйста, проверьте учебник, который я опубликовал, методы делегирования одинаковы в Swift и ObjC. - person derdida; 30.08.2014
comment
нет, моя проблема решена после того, как я написал эти методы от вас, и спасибо за это, но xcode все еще не завершается автоматически, прежде чем я напишу эти методы бла-бла-бла, но, по крайней мере, я понял ситуацию здесь, я уже видел этот пост раньше с obj-C, большое спасибо :) - person Amr Mohamed; 30.08.2014
comment
Нет предложения реализовать методы делегата при принятии протоколов, как в старом XCode. Он просто показывает does not conform to protocol ошибку. Вы должны написать/реализовать методы самостоятельно, которые вы можете найти в документации, если не помните. - person iphondroid; 20.04.2015
comment
dl.dropboxusercontent.com/u/2857188/BGTransferDemo.zip находится ссылка на завершенный учебный проект URL-адреса выше. - person Vin; 13.06.2017