-4

例如:

- (void)someFunc {

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

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

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

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

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

我知道 method applicationWillTerminate:,但我不知道如何用它解决当前的问题。

已编辑

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

已编辑

对于那些用离题答案发送垃圾邮件的人:首先阅读标题 -用户退出应用程序时保存状态。您在哪里看到将应用程序置于后台?

4

4 回答 4

1

你应该使用后台任务!看看这里的文档:

在后台执行有限长度的任务

将 someFunc 的调用放在后台任务的中间。如果您的应用程序进入后台状态,您将有额外的时间来完成该方法的执行。

于 2013-09-02T14:26:02.960 回答
1

这没有意义。如果这些函数在主线程上运行,则应用程序无法在函数运行时正常终止。这是因为发送的事件applicationWillTerminate:是在同一个线程上发送的。

如果您的函数在与主线程不同的线程上运行,您将需要在每个函数完成后保存一些状态信息,但您仍然有竞争条件。

在运行每个函数之前检查应用程序的状态可能会更好。例如,如果您有一个服务器的三步登录/注册过程,您应该在运行之前查询服务器以查看该阶段是否已经完成。

如果不知道您在这些函数中做什么,就很难更具体。

于 2013-09-03T10:59:12.060 回答
0

让你的函数返回 bool,当你调用它们时,将 bool 值存储到 nsdefaults。

当应用程序重新启动时,检查 sndefaults 中的布尔值,如果它们不是,则运行函数并更新它们。

于 2013-09-02T14:29:48.600 回答
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;
        }
    }
    
于 2013-09-03T09:50:06.063 回答