我有一個應用程序下載的應用程序。我用這種方式成功下載了mp3文件:下載時的進度條
NSData *data1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../somefile.mp3"]];
[data1 writeToFile:filePath atomically:YES];
但是這段代碼執行時確實有很大的停頓。我如何計算下載的進度並用進度條顯示它?
我有一個應用程序下載的應用程序。我用這種方式成功下載了mp3文件:下載時的進度條
NSData *data1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../somefile.mp3"]];
[data1 writeToFile:filePath atomically:YES];
但是這段代碼執行時確實有很大的停頓。我如何計算下載的進度並用進度條顯示它?
問題是dataWithContentsOfURL:
是一個阻塞呼叫。這意味着它會阻塞正在運行的線程。
你有幾個選擇來解決這個問題,最好的可能是使用NSURLConnection
。
通過NSURLConnection
可以異步執行下載請求,這將防止它阻止主線程。
您必須使用NSURLConnectionDelegate
方法獲知下載進度,保存其數據並獲知成功或失敗的通知。
請閱讀NSURL Loading System的文檔。
使用NSURLConnection
的替代方法是使用調度隊列對GCD進行一些調用來包裝當前代碼。這將阻止呼叫阻止您的用戶界面,但它不會讓您確定進度 - 因爲您仍然需要使用NSURLConnection
。
是的,我知道阻止。 NSURLConnection的Thnx =) – 2012-03-22 11:03:32
你真的應該看看的ASIHTTPRequest,尤其是this section
它提供的回調跟蹤您的下載,異步和同步連接,隊列,緩存和大量的好東西。
請注意頁面頂部的警告:_請注意,我不再在這個庫上工作 - 您可能要考慮爲新項目使用其他內容。 :)_ – 2012-03-22 10:59:57
@TimBüthe是的,我剛看到它! :P 但我仍然認爲這是一個很好的圖書館,如果只關心某些類,那麼它自己就很容易維護它。但是,嘿,這是我的看法,我猜:) – Alladinian 2012-03-22 11:08:00
看看https://github.com/jdg/MBProgressHUD來顯示進度。 – 2012-03-22 11:22:50