Загрузите файл с AFNetworking в swift

Я хочу загрузить файл с URL-адреса с помощью AFNetworking в swift и показать процесс загрузки. У меня есть этот код, но он не работает:

func downloadPdf()
{
 var request = NSURLRequest(URL: NSURL(string: "http://www.sa.is/media/1039/example.pdf"))
 let session = AFHTTPSessionManager()

 var progress: NSProgress?

 var downloadTask = session.downloadTaskWithRequest(request, progress: &progress, destination: {(file, responce) in self.pathUrl},
 completionHandler:
 {
 response, localfile, error in
 println("response \(response)")
 })

 downloadTask.resume()
}

var pathUrl: NSURL
{
 var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
 var url = NSURL(string: path.stringByAppendingPathComponent("file.pdf"))
 println(url.path)
 return url
}

Что я делаю неправильно?

1 ответ

Проблема заключается в вычисленном свойстве pathUrl. Если вы напечатаете URL-адрес (а не url.path), вы увидите, что ваш URL-адрес недействителен. Это потому, что вы используете NSURL(string:) и для URL-адресов файлов, вы должны использовать NSURL(fileURLWithPath:). Таким образом:

var pathUrl: NSURL {
 let documentsFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
 let documentsURL = NSURL(fileURLWithPath: documentsFolder)
 return documentsURL.URLByAppendingPathComponent("file.pdf")
}

Или, что еще лучше, обойти путь вообще и использовать URLForDirectory чтобы получить .DocumentDirectory в качестве URL-адреса:

var pathUrl: NSURL {
 return try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
 .URLByAppendingPathComponent("test.pdf")
}

Или в Swift 3:

var pathUrl: URL {
 return try! FileManager.default.urlForDirectory(.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
 .appendingPathComponent("test.pdf")
}

licensed under cc by-sa 3.0 with attribution.