例如:
- (void)someFunc {
[self someFunc1];
[self someFunc2];
[self someFunc3];
}
我叫someFunc。据我了解,如果我中断应用程序,那么应用程序不保证someFunc中的所有内部代码都将被执行。
我必须只调用someFunc1,someFunc2和someFunc3一次。
我不知道如何解决的问题:
我知道方法applicationWillTerminate:
,但我不知道如何解决当前的问题。
EDITED
多任务处理不是一个解决方案,因为Even if the device is running iOS 4 or later, the device may not support multitasking.
,因此它无法解决一般问题,只能使最终解决方案更加困难。
EDITED
对于那些使用非主题答案的垃圾邮件的人:首先阅读标题 - 当用户退出应用程序时保存状态。你在这里看到了将应用程序置于后台的地方吗?
答案 0 :(得分:1)
你应该使用后台任务! 看一下这里的文档:
Executing a Finite-Length Task in the Background
将someFunc调用放在后台任务的中间。 如果您的应用程序进入后台状态,您将有更多时间来完成方法的执行。
答案 1 :(得分:1)
这没有意义。如果这些函数在主线程上运行,则在函数运行时,应用程序无法正常终止。这是因为像applicationWillTerminate:
这样发送的事件是在同一个线程上发送的。
如果您的函数在与主线程不同的线程上运行,则需要在每个函数完成后保存一些状态信息,但仍然存在竞争条件。
在运行每个函数之前检查应用程序的状态可能会更好。例如,如果您有一个服务器的三步登录/注册过程,您应该在运行之前查询服务器以查看该阶段是否已经完成。
如果不知道你在这些功能中做了什么,就很难具体化。
答案 2 :(得分:0)
让你的函数返回bool,当你调用它们时,将bool值存储到nsdefaults。
当应用程序重新启动时,检查来自sndefaults的bool,如果它们为NO,则运行这些函数并更新它们。
答案 3 :(得分:0)
没有人愿意提供帮助。所以我的临时解决方案:
保存最后一个状态我使用写入文件,因为它可以将其操作设置为原子/非原子
我用这样的代码替换了这段代码:
typedef enum {
state1,
state2,
state3
} MyState;
@property (assign) MyState state;
-(void)someFunc {
switch (state) {
case state1:
{
[self someFunc1];
state = state2;
[self someFunc];
break;
}
case state2:
{
[self someFunc2];
state = state3;
[self someFunc];
break;
}
default:
break;
}
}