2012-03-22 104 views
3

我有一个应用程序下载的应用程序。我用这种方式成功下载了mp3文件:下载时的进度条

NSData *data1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../somefile.mp3"]]; 
[data1 writeToFile:filePath atomically:YES]; 

但是这段代码执行时确实有很大的停顿。我如何计算下载的进度并用进度条显示它?

+1

看看https://github.com/jdg/MBProgressHUD来显示进度。 – 2012-03-22 11:22:50

回答

4

问题是dataWithContentsOfURL:是一个阻塞呼叫。这意味着它会阻塞正在运行的线程。

你有几个选择来解决这个问题,最好的可能是使用NSURLConnection

通过NSURLConnection可以异步执行下载请求,这将防止它阻止主线程。

您必须使用NSURLConnectionDelegate方法获知下载进度,保存其数据并获知成功或失败的通知。

请阅读NSURL Loading System的文档。

使用NSURLConnection的替代方法是使用调度队列对GCD进行一些调用来包装当前代码。这将阻止呼叫阻止您的用户界面,但它不会让您确定进度 - 因为您仍然需要使用NSURLConnection

+0

是的,我知道阻止。 NSURLConnection的Thnx =) – 2012-03-22 11:03:32

1

你真的应该看看的ASIHTTPRequest,尤其是this section

它提供的回调跟踪您的下载,异步和同步连接,队列,缓存和大量的好东西。

+0

请注意页面顶部的警告:_请注意,我不再在这个库上工作 - 您可能要考虑为新项目使用其他内容。 :)_ – 2012-03-22 10:59:57

+1

@TimBüthe是的,我刚看到它! :P 但我仍然认为这是一个很好的图书馆,如果只关心某些类,那么它自己就很容易维护它。但是,嘿,这是我的看法,我猜:) – Alladinian 2012-03-22 11:08:00