2010-09-04 2 views
0

Я хочу исключить все переменные, сохраненные во всех полях NSUserDefault, всякий раз, когда приложение закрыто или работает в фоновом режиме в течение определенного времени - скажем, 5 минут.Настройка iPhone NSUserDefaults для nil, когда приложение закрыто или в фоновом режиме

Я попытался добавить строку в приложение делегата applicationDidFinishLaunching, который выглядит следующим образом:

if (UIApplicationStateBackground == TRUE) { 
    NSUserDefaults *profiles = [NSUserDefaults standardUserDefaults]; 

    [profiles setObject:nil forKey:@"name1"]; 
    [profiles synchronize]; 
} 

Я также добавил только эту часть к applicationWillTerminate:

NSUserDefaults *profiles = [NSUserDefaults standardUserDefaults]; 

    [profiles setObject:nil forKey:@"name1"]; 
    [profiles synchronize]; 

Все это, кажется, работать, и я понятия не имею, как установить условие «если 5 минут превзошло приложение, находящееся в фоновом режиме, удалить переменные NSUserDefaults» - Любая помощь?

+0

applicationDidFinishLaunching вызывается при запуске, и он никогда не будет запускаться AFAIK. – mk12

+0

Правильно. Однако Apple заявляет в своей документации о applicationDidFinishLaunchingWithOptions: «Примечание. Настоятельно рекомендуется использовать этот метод для инициализации вашего приложения, а не метода applicationDidFinishLaunching :.» – GorillaPatch

ответ

8

Я бы рекомендовал, чтобы удалить объект вместо того, чтобы установить его в ноль.

- (void)removeObjectForKey:(NSString *)defaultName; 

Нормальное поведением NSUserDefaults является возвращением ноля, когда нет никакого ключа, соответствующего запрос, поэтому я считаю, что лучше следовать тому же правилу и не хранить ноль для определенного ключа.

Надеюсь, что это поможет.

+0

Когда я пытаюсь поместить [profiles removeObjectForKey: @ "name1"]; Я получаю сообщение об ошибке, что NSUserDefaults может не отвечать на removeObjectForKey. Я не понимаю, потому что определение removeObjectForKey содержится в документации NSUserDefaults. – startuprob

+0

Странно ... Я не могу повода для этой ошибки. Попробуйте очистить свой проект и, конечно же, да, но уверены ли вы, что профили являются экземпляром NSUserDefaults? – nacho4d

+0

В моем коде выше создаются профили как экземпляр. Я очищался и перестраивался, и на самом деле ошибка «NSUserDefaults может не отвечать ...» - но если вы посмотрите в документации, removeObjectForKey: находится в документации NSUserDefaults - так странно – startuprob

0

Возможно, вам следует использовать applicationDidEnterBackground :. Проверьте страницу this apple doc.

0

Я бы сделал следующее: в вызове делегата - (void)applicationWillResignActive:(UIApplication *)application из UIApplication Я бы сохранил временную метку, когда приложение зашло в фоновый режим. В этом случае вам не нужно проверять, идет ли приложение на задний план или если оно просто прервано, например, SMS, но пользователь нажимает кнопку «Отмена» и продолжает использовать ваше приложение.

При запуске приложения снова реализует код в другом методе делегирования UIApplication - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions, чтобы определить, как долго вы были неактивны и уничтожить UserDefaults или нет в зависимости от продолжительности.

Для получения дополнительной информации о приложении становится неактивным и перезапуск проверить этот документ документации Apple, http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40007072-CH3-SW10

Смежные вопросы