下载时进度条

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

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

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

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

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

使用NSURLConnection可以asynchronous执行下载请求,这将防止它阻塞主线程。

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

请阅读NSURL加载系统的文档。

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

你应该看看ASIHTTPRequest ,特别是这一节

它提供了跟踪你的下载,asynchronous和同步连接,队列,caching和许多好东西的callback。