启动应用程序时dataWithContentsOfURL是否有问题?

时间:2011-11-20 04:05:59

标签: objective-c multithreading grand-central-dispatch

我创建了一个应用程序,可以在第一次启动时访问某些数据,然后显示它。我一直在这样下载这些数据:

NSData *data = [NSData dataWithContentsOfURL:url];

这不好吗?现在我已经设置了包含它的方法在后台线程中使用GCD运行,但是我听说由于dataWithContentsOfURL是同步的,所以它很糟糕。对此有何意见?

2 个答案:

答案 0 :(得分:5)

如果在主UI线程上运行它会很糟糕。这将阻止你的应用程序的响应能力,这很糟糕,但在启动时更糟糕。

你需要让它异步。您可以通过在后台线程(GCD dispatch_async)上运行该方法或使用NSUrlConnection的异步方法来实现此目的。

以下是使用GCD在后台工作,然后在主线程上更新UI(完成后)的示例:

GCD, Threads, Program Flow and UI Updating

另一个选项是NSUrlConnection的异步方法。请参阅此处的initWithRequest方法:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

答案 1 :(得分:3)

只要你在后台线程中运行它就是安全的 同步加载错误的想法仅对主UI线程有效。主UI线程上的长时间运行操作将使您的应用无响应。在后台执行此操作是正确的方法。另外,请考虑使用:

+dataWithContentsOfURL:options:error: 

如果出现任何问题,您可以收到错误。