2015-09-06 3 views
0

Я пытаюсь скачать файл с интернетом и поместить его в каталоге имени приложения под каталогом поддержки приложений, и я постоянно получаюNSURLDownload: Утверждение не удалось ([путь isAbsolutePath]) неприятностями

Assertion failed: ([path isAbsolutePath]), function -[NSURLDownload  setDestination:allowOverwrite:], file /SourceCache/CFNetwork/CFNetwork-720.5.7/Foundation/NSURLDownload.mm, line 370. 

Вот код, который я написал:

var imageRequest = NSURLRequest(URL: self.source) 
    var imageDownload = NSURLDownload(request: imageRequest, delegate:self) 
    var error: NSError? = NSError() 

    /* does path exist */ 
    let directoryPath = self.destination.stringByDeletingLastPathComponent 
    let fileMgr = NSFileManager(); 
    fileMgr.createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil, error: &error) 
    imageDownload.setDestination(self.destination, allowOverwrite: true); 

Когда я просматриваю код, все выглядит правильно. self.source является (https: /remoteDomain.com/img/downloadimage.jpg) NSURL

self.destination полный путь в моей системе (файл:/Users/Райана/Library/Application% 20Support/AppName/downloadimage.jpg)

Любые идеи?

+0

Вместо этого вы должны использовать NSURLSessionDownloadTask. – jtbandes

+0

Это для OSX-приложения. Разве NSURLSessionDownloadTask больше не подходит для IOS? –

ответ

1

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

let fileManager = NSFileManager.defaultManager() 

var folder = "~/Library/Application Support/[APPNAME]/someFolder" as NSString 
folder = folder.stringByExpandingTildeInPath 

if fileManager.fileExistsAtPath(folder as String) == false { 
    do { 
     try fileManager.createDirectoryAtPath(folder as String, withIntermediateDirectories: true, attributes: nil) 
    } 

    catch { 
     //Deal with the error 
    } 
} 

НО @jtbandes прав. Вы должны использовать NSURLSessionDownloadTask для загрузки файлов. Это часть Foundation.framework, которая доступна на OS X, iOS и watchOS.

Причина заключается в том, что Apple продолжает обновлять этот Api, чтобы соответствовать последним стандартам. Например, вам не нужно беспокоиться о IPv4 или IPv6 и т. Д. Это позволяет избежать сбоев и странного поведения в вашем приложении.

Это, как вы его используете (Swift):

var imageRequest = NSURLRequest(URL: self.source) 
let session = NSURLSession.sharedSession() 
let downloadTask = session.downloadTaskWithRequest(imageRequest) { (url: NSURL?, response: NSURLResponse?, error: NSError?) -> Void in 
    //Work with data 
} 

downloadTask.resume() 

Обратите внимание, что url это путь к загруженному изображению.

+0

Большое спасибо. Я попробую! –

Смежные вопросы