iOS版。用户退出应用程序时保存状态?

时间:2013-09-02 14:18:16

标签: ios objective-c save state terminate

例如:

- (void)someFunc {

    [self someFunc1];
    [self someFunc2];
    [self someFunc3];
}

我叫someFunc。据我了解,如果我中断应用程序,那么应用程序不保证someFunc中的所有内部代码都将被执行。

我必须只调用someFunc1,someFunc2和someFunc3一次。

我不知道如何解决的问题:

  • someFunc1,someFunc2和someFunc3应该原子调用。
  • 存储下次发布的信息。例如,如果我们成功执行了someFunc1,那么在下次启动时,应用程序应该只调用someFunc2和someFunc3。

我知道方法applicationWillTerminate:,但我不知道如何解决当前的问题。

EDITED

多任务处理不是一个解决方案,因为Even if the device is running iOS 4 or later, the device may not support multitasking.,因此它无法解决一般问题,只能使最终解决方案更加困难。

EDITED

对于那些使用非主题答案的垃圾邮件的人:首先阅读标题 - 当用户退出应用程序时保存状态。你在这里看到了将应用程序置于后台的地方吗?

4 个答案:

答案 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;
        }
    }