我正在编写一个可可应用程序,我想在其中从网络服务器下载文件。这样做最方便的方法是什么?我应该选择 NSSockets 还是 NSUrlRequest?或者有没有其他更简单的方法来实现这一点?
6 回答
如果要将文件的内容加载到内存中,许多 Cocoa 数据类,如 NSString、NSData 甚至 NSDictionary 都有initWithURL:
方法,这些方法直接使用 Web 请求的内容进行初始化。它们非常易于使用,但它们不是很灵活或提供良好的错误处理。如果需要,NSURLConnection 提供了一种更灵活的方式来加载数据。
如果您想将文件直接下载到磁盘,那么 NSURLDownload 将是最好的选择。
一个警告:initWithURL: 方法是阻塞的,如果文件很大,服务器很慢,用户的互联网连接很慢等,这是一个大问题。不要从主线程调用它们。
您也不会收到任何进度报告,因此当下载速度较慢时,您无法告诉用户它走了多远或需要多长时间。
在几乎所有情况下,您都应该使用 NSURLDownload 或 NSURLConnection 来代替。
最简单的做法可能是使用 NSURLDownload 和 NSURLRequest。
如果你想从 web 服务中获取数据到 NSString 或 NSData 中,NSURLConnection 是很好的选择。确保在 NSURLConnection 方法中进行异步调用并处理错误和数据
这是 REST 风格调用的一个很好的例子 http://kosmaczewski.net/2008/03/26/playing-with-http-libraries/
NSURLConnection 确实给了你最大的粒度,但要小心 NSURLConnection 的 sendSynchronousRequest() 方法。 它每次都会泄漏内存(已附加 XCode Leak Instrumentation 工具并运行它以向我自己证明)并且有时会无缘无故地给出奇怪的 HTTP 204 响应。 我在这里写过关于这个的博客
另一种方法是使用预装在任何 OS X 系统上的 libcurl。如果你使用这种方法,你最好确保像代理等系统设置受到尊重。