3

我有一个函数,我使用可可的 Url 对象从网络获取外部资源。它在模拟器上运行良好,但偶尔会在设备本身上失败(这是一个谷歌查询,所以资源显然确实存在)。这让我相信硬件上有一些内部超时障碍,但还没有读到这样的障碍是否存在。

还有其他人遇到过类似的问题吗?或者知道超时是否已记录或可以更改?

4

5 回答 5

5

如果您的应用程序似乎变得无响应,iPhone OS 将终止它 - 基本上是如果您的主线程阻塞了几秒钟。这在退出时也很重要 - 如果您在退出时保存,您将有一个非常小的窗口来完成保存,这与操作系统可能正在执行其他操作的事实相得益彰。如果您退出操作系统的时间过长,则会杀死您的应用程序,这对用户来说就像您的应用程序无法保存一样。

我强烈建议您测试与硬件而不是模拟器相关的任何时间。该模拟器非常适合快速周转调试,但不能代表实际硬件的性能。

如果您有任何繁重的工作要做,请在单独的线程上执行,以便 UI 保持对用户和操作系统的响应。

于 2008-10-04T03:27:34.367 回答
4

iPhone 对应用程序启动施加了超时。因此,如果您在 applicationDidFinishLaunching 中执行广泛的处理:例如,应用程序将被终止并生成崩溃日志。不幸的是,我在官方文档中没有提到它。

启动过程完成后,我不知道有任何限制函数执行时间的超时。我已经在设备上尝试过,在主线程中休眠 30 秒,效果很好。

于 2008-10-06T13:31:36.223 回答
4

我在 applicationDidFinishLaunching 中读取一个大文件时注意到了这个超时。我的应用程序将在启动期间终止。在控制台中,我看到了日志消息:

Sun Mar  1 10:41:03 unknown SpringBoard[22] <Warning>: <myappid>.* failed to launch in time

我的解决方案是使用performSelector: withObject: afterDelay: 0.0从 appliationDidFinishLaunching 快速返回并在 runloop 上排队加载文件。这避免了设置新线程和处理多线程的复杂性。

于 2009-03-01T18:19:50.087 回答
1

我知道如果应用程序使用太多内存,iPhone OS 会杀死它,所以如果应用程序对事件没有响应时间过长,如果它使用相同的策略,我不会感到惊讶。

如果您正在编写桌面应用程序,问题将表现为旋转的彩虹沙滩球光标,并且您的应用程序不会响应鼠标点击。Mac OS X 不会终止您的应用程序,但如果您在 Dock 中按住 ctrl 单击其图标,它会提供强制退出它。

这里的主要问题是您正在占用事件处理线程。你有两个选择:

  1. 使用非阻塞 I/O,因此您无需在一次调用中执行 Web 请求,而是使用 API 在后台获取数据,然后在完成时调用您指定的方法。
  2. 在单独的线程上使用阻塞 I/O。就像你现在做的那样做网络请求,但是在一个单独的线程中,然后在你完成后向主线程发出信号。
于 2008-10-04T02:56:36.333 回答
1

如果您使用的是 NSUrlRequest,请确保未达到超时间隔。您的手机的互联网连接速度可能比您的模拟器慢。

从文档:

+ (id)requestWithURL:(NSURL *)theURL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval

Parameters
theURL
The URL for the new request.

cachePolicy
The cache policy for the new request.

timeoutInterval
The timeout interval for the new request, in seconds.

Return Value
The newly created URL request.
于 2008-10-06T05:38:50.920 回答