2012-12-13 147 views
0

我有一个应用程序,当终止时需要同步一个sqlite数据库的内容。
要知道应用程序何时终止,我在应用程序委托的applicationWillTerminate:方法中放置了一个断点。但调试器从不在那里执行。
我知道两种方法来终止应用程序:iOS模拟器:应用程序无法终止correcly

  1. 就像我在iPhone上做:保持触摸应用程序图标,直到它开始颤抖,我在点击“X”;
  2. 停止调试器。

无这两种方法导致调试步骤在applicationWillTerminate:我的应用程序委托的方法。
如果我用第一种方法我甚至得到一个异常:我收到SIGKILL就在这一行:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

好像模拟器启动SIGKILL即使没有该信号的处理程序。
最后一条消息是mach_msg_trap。

+1

阅读文档:“对于不支持后台执行的应用程序或者与iOS 3.x或更低版本链接的应用程序,此方法总是在用户退出应用程序时调用。对于支持后台执行的应用程序,此方法通常不会在用户退出应用程序时调用,因为在这种情况下,应用程序只是移动到后台,但是,在应用程序在后台运行(未挂起)并且系统需要终止某些应用程序的情况下原因。” –

+2

@MikeWeller你应该把它作为一个答案..... –

+0

我太懒惰了:P –

回答

2

从文档

对于不支持后台执行或正在 链接的是iOS版3.x或更早的时候 用户退出应用这种方法总是被调用的应用程序。对于支持 后台执行的应用程序,当用户退出应用程序时,通常不会调用此方法,因为在这种情况下应用程序仅移动到 背景。但是,可能会在 应用程序在后台运行(而不是 挂起)并且系统因某种原因需要终止应用程序的情况下调用此方法。

您可能想要applicationWillResignActive:

+0

有点怀疑在这里:我是否有义务在应用程序变为活动状态时从数据库加载数据,并在应用程序变为活动状态时同步它进入背景?我不知道应用程序何时终止? –

+2

否。如果应用程序在后台并终止释放内存(例如),则不会收到通知。你只能处理像'applicationDidEnterBackground:'或'applicationWillResignActive:'这样的事件。 –

+0

您还应该确保同步不会花费太多时间,否则操作系统会在完成写入数据库之前终止应用程序。向操作系统请求额外的时间来完成后台处理可能是一个不错的主意,该后台处理最多可让您同步数据库10分钟。它有助于防止不必要的崩溃,并确保您的数据保持一致 –

相关问题