4

我正在编写一个可可应用程序,我想在其中从网络服务器下载文件。这样做最方便的方法是什么?我应该选择 NSSockets 还是 NSUrlRequest?或者有没有其他更简单的方法来实现这一点?

4

6 回答 6

5

如果要将文件的内容加载到内存中,许多 Cocoa 数据类,如 NSString、NSData 甚至 NSDictionary 都有initWithURL:方法,这些方法直接使用 Web 请求的内容进行初始化。它们非常易于使用,但它们不是很灵活或提供良好的错误处理。如果需要,NSURLConnection 提供了一种更灵活的方式来加载数据。

如果您想将文件直接下载到磁盘,那么 NSURLDownload 将是最好的选择。

于 2008-12-26T17:20:50.013 回答
2

一个警告:initWithURL: 方法是阻塞的,如果文件很大,服务器很慢,用户的互联网连接很慢等,这是一个大问题。不要从主线程调用它们。

您也不会收到任何进度报告,因此下载速度较慢时,您无法告诉用户它走了多远或需要多长时间。

在几乎所有情况下,您都应该使用 NSURLDownload 或 NSURLConnection 来代替。

于 2008-12-26T22:41:17.633 回答
1

最简单的做法可能是使用 NSURLDownload 和 NSURLRequest。

于 2008-12-26T14:44:16.537 回答
1

如果你想从 web 服务中获取数据到 NSString 或 NSData 中,NSURLConnection 是很好的选择。确保在 NSURLConnection 方法中进行异步调用并处理错误和数据

这是 REST 风格调用的一个很好的例子 http://kosmaczewski.net/2008/03/26/playing-with-http-libraries/

于 2009-01-07T14:30:45.160 回答
1

NSURLConnection 确实给了你最大的粒度,但要小心 NSURLConnection 的 sendSynchronousRequest() 方法。 它每次都会泄漏内存(已附加 XCode Leak Instrumentation 工具并运行它以向我自己证明)并且有时会无缘无故地给出奇怪的 HTTP 204 响应。 我在这里写过关于这个的博客

于 2009-01-16T22:40:40.147 回答
0

另一种方法是使用预装在任何 OS X 系统上的 libcurl。如果你使用这种方法,你最好确保像代理等系统设置受到尊重。

于 2008-12-28T15:25:15.533 回答