2008-10-04 50 views
3

我有一个函数,我使用cocoa的Url对象从web获取外部资源。它在模拟器上工作正常,但偶尔会在设备上失败(这是一个谷歌查询,所以资源显然确实存在)。这导致我相信硬件上存在一些内部超时屏障,但没有看到存在或不存在这样的屏障。如果函数执行时间过长,iPhone是否超时?

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

回答

4

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

启动过程完成后,我不知道任何限制函数执行时间的超时。我已经在设备上试了一下,并在主线程中放置了30秒的睡眠时间,并且工作正常。

+0

谢谢,基本上问题是我错过了什么lajos回答,在初始化阶段,以获得一些起始数据。现在我第一次加载,然后在应用程序准备就绪后获取数据,并且我没有任何问题 – 2008-10-07 02:41:37

1

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

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

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

  1. 使用非阻塞的O I /,所以不是在做一个调用web请求您使用的获取在背景中的数据,然后调用时,它的完成您指定的方法的API 。
  2. 在单独的线程上使用阻塞I/O。网络请求就像你现在正在做的一样,但在一个单独的线程中,然后在完成时发出主线程信号。
5

iPhone操作系统将终止您的应用程序,如果它似乎已变得没有反应 - 基本上如果你的主线程阻塞几秒钟。这在退出时也很重要 - 如果在退出时保存,则会有一个非常小的窗口来完成保存,而操作系统可能正在做其他事情。如果您花费太长时间才能退出操作系统,则会导致您的应用程序无法保存,从而导致您的应用程序出现给用户。

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

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

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

谢谢,在我的情况下,这正是问题所在。然而,从长远来看,将这些请求交给一个线程将是一个更好的主意。 – 2008-10-07 02:39:34

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文件加载。这避免了建立一个新的线程并处理多线程的复杂性。

+0

保持程序简单,没有线程的好主意。 – 2009-03-02 00:39:22