2015-04-16 49 views
0

所以,當我運行這個功能下載的NSURLSessionDownloadDelegate數據存儲在哪裏?

func run(u: String) { 
    let URL = NSURL(string: u) 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil) 
    let dtask = session.downloadTaskWithURL(URL!) 
    dtask.resume() 
} 

我想到了這個方法:

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { 
    NSOperationQueue.mainQueue().addOperationWithBlock({ 
     let text = NSString(contentsOfURL: location, encoding: NSUTF8StringEncoding, error: nil) 
     println(text) 
     self.done() 
    }) 
} 

打印已下載的​​文件的位置,但它總是返回零。

不應該返回實際路徑嗎?甚至location變量始終是零,以及...

+1

它位於一個名爲tmp的文件夾內,位於與文檔文件夾相同的父文件夾內。如果臨時文件一旦完成就不會將它移動到文檔文件夾,它將立即被刪除(這是一個臨時文件) –

+0

因此,當它到達... didFinishDownloadingToURL位置...方法時,它已被刪除? – matt

+0

我通常使用完成塊保存它,所以我不知道問題是否是addOperationBlock –

回答

1
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { 
     let text = NSString(contentsOfURL: location, encoding: NSUTF8StringEncoding, error: nil) 
     println(text) 
     self.done() 
) 

嘗試上面的代碼

你必須拯救你這個方法didFinishDownloadingToURL返回之前下載數據。

例如,您可以在內存中使用它或將tmp文件移動到另一個dic。

如果你使用你的代碼,當你執行你的代碼塊時,該方法已經返回。因爲如果你使用addOperationwithBlock,它是一個異步代碼塊。它會先返回,然後執行代碼塊。 因此,在你的情況下,當你完成下載,你的方法首先返回,然後你執行block.So,你什麼都沒有