2013-09-02 1 views
-4

Например:iOS. Сохранить состояние, когда пользователь выходит из приложения?

- (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

Для тех, кто рассылает спам с не по теме ответов: прочитать название первого - Сохранить состояние, когда пользователь выходит из приложения. Где вы видели здесь приложение приложения в фоновом режиме?

+0

В эти дни вы можете поддерживать только iOS 4.3 или новее (и никакие новые приложения не должны тратить время на поддержку чего-либо ранее, чем iOS 5.1 или даже 6.1). ВСЕ устройства с 4.3 или более поздними версиями поддерживают многозадачность. Поэтому многозадачность - хорошее решение. – rmaddy

+0

По словам developer.apple.com, 94% устройств работают под управлением iOS 6. Даже снижая поддержку iOS 5 вырезает небольшой кусок рынка! https://developer.apple.com/devcenter/ios/checklist/ – bbum

ответ

1

Это does't смысл. Если эти функции запущены в основном потоке, то нет возможности нормально завершить работу приложения во время работы ваших функций.Это связано с тем, что события, отправленные как applicationWillTerminate:, отправляются в тот же поток.

Если ваша функция работает с другим потоком в основном потоке, вам необходимо сохранить некоторую информацию о состоянии после завершения каждой функции, но у вас все еще есть условие гонки.

Возможно, вам лучше проверить состояние приложения перед запуском каждой функции. Например, если у вас есть трехэтапный процесс входа/регистрации с сервером, вы должны запросить сервер, чтобы убедиться, что этап уже завершен до его запуска.

Трудно быть более конкретным, не зная, что вы делаете в этих функциях.

+0

Это пример того, что я использую. Эти функции (или часть их кода) могут обрабатываться в разных потоках, но они всегда имеют этот порядок: 1, 2, 3. В моей текущей реализации следующий вызов функции помещается в конец предыдущего. Моя идея состоит в том, чтобы хранить как минимум шаги, которые уже обработаны. Поэтому я могу проиграть последний шаг, но я всегда знаю, что все предыдущие шаги уже выполнены. – user2083364

1

Вы должны использовать фоновые задачи! Посмотрите на документацию здесь:

Executing a Finite-Length Task in the Background

Поместите вызов SomeFunc в середине фоновой задачи. Если ваше приложение переходит в фоновое состояние, у вас будет дополнительное время для завершения выполнения метода.

+0

Спасибо, но «Даже если устройство работает под управлением iOS 4 или более поздней версии, устройство может не поддерживать многозадачность». Так что это не ответ, и я даже имеют больше проблем, если я использую фоновые задачи, потому что они не всегда доступны – user2083364

+0

Я отредактировал свой вопрос – user2083364

0

Сделайте свои функции для возврата bool, а когда вы их вызовете, сохраните значение bool в nsdefaults.

Когда приложение перезагрузится, проверьте bools из sndefaults, и если они НЕТ, запустите функции и обновите их.

+0

Проблема также в том, как атомизировать подтверждения изменений и сохранять текущее состояние в настройках. Например, если вы обновляете базу данных, и пользователь прерывает этот процесс до обновления текущего состояния в настройках, то при следующем запуске приложение думает, что оно не пыталось обновить базу данных. – user2083364

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