如果函数执行时间太长,iPhone是否会超时?

时间:2008-10-04 01:06:55

标签: iphone cocoa

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

其他人遇到类似问题?或者知道是否记录了超时或可以更改超时?

5 个答案:

答案 0 :(得分:5)

iPhone OS将终止您的应用程序,如果它似乎没有响应 - 基本上如果您的主线程阻塞几秒钟。这在退出时也很重要 - 如果你在退出时保存,你有一个非常小的窗口来完成保存,而操作系统可能正在做其他事情。如果您花费太长时间退出操作系统,则会杀死您的应用程序,该应用程序会向用户显示,就像您的应用程序无法保存一样。

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

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

答案 1 :(得分:4)

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

启动过程完成后,我不知道任何限制功能执行时间的超时。我已经在设备上尝试了它,在主线程中放置了30秒睡眠,它运行正常。

答案 2 :(得分: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上排队文件加载。这避免了设置新线程并处理多线程的复杂性。

答案 3 :(得分:1)

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

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

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

  1. 使用非阻塞I / O,因此您不必在一次调用中执行Web请求,而是使用API​​在后台获取数据,然后在完成后调用您指定的方法。
  2. 在单独的线程上使用阻塞I / O.像你现在一样做web请求,但是在一个单独的线程中,然后在你完成时发出主线程的信号。

答案 4 :(得分:1)

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

来自doc:

+ (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.