2013-10-09 4 views
1

УсловияApp возобновился от фона, всухую свойство NSManagedObject

  • Получение уведомления (TXT сообщений)
  • или открытия/закрытия Центр уведомлений
  • или переключиться на другое приложение, вернуться

В основном, приложение возвращается с фона на короткий период.

Выпуск

Layout это нормально, но некоторые из моих свойств, которые я получаю от CoreData пустуют после выхода из фона. Эта проблема существует почти для всех моих контроллеров.

Проект

Это приложение, которое имеет главный контроллер TabBar с два navigationcontrollers внутри вкладки и, возможно два уровня viewcontrollers, которые сам ребенок UIViews (которые используют некоторые из информаций). Внутренняя часть состоит из Parse и CoreData.

Странная часть

Назад от фона -> свойства хорошо на viewWillAppear (Создать резервную копию ид) -> они равны нулю секунд после того, как -> Мне нужно вручную вернуть их обратно (от ID я просто хранится)

Вот скриншот, когда поставив точку останова внутри функции, вызываемой каждый 5сек, чтобы проверить текущее время (link to bigger): enter image description here

Что я сделал

NSCoder реализован для восстановления состояния, и каждый контроллер вида имеет идентификатор восстановления, однако он не вызывается, когда приложение становится активным. Я не думаю, что NSCoder является проблемой здесь, поскольку из документации она используется, когда ОС будет убивать ее сама по себе, или сила уходит от пользователя.

Я попытался вручную обновить содержимое в соответствующих ViewControllers из NSNotificationCenter, если NSManagedObjects равен нулю, но он не является надежным для будущего и никогда не является такой же логикой для каждого представления.

Любые мысли? Спасибо!

Мои AppDelegate:

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    NSLog(@"Will Resign Active"); 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    NSLog(@"Entered Background"); 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    NSLog(@"Will enter Foreground"); 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application { 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"needsRefresh" object:self userInfo:nil]; // Helpful in some viewcontrollers to save variables that are not nil. 

    [PF_FBSession.activeSession handleDidBecomeActive]; 
} 

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    NSLog(@"Will Terminate"); 
} 
+1

Вы пытались поставить точку останова на сеттер для '_booking' и посмотреть, что это такое? Трудно понять, что происходит, поскольку вы не показываете какой-либо код реализации, или если у вас есть какие-либо уведомления, отправленные в 'applicationWillEnterForeground' и т. Д., Которые могут повлиять на это. – iwasrobbed

+0

@iWasRobbed Отредактировано! Мой делегат в значительной степени пуст, я снова отредактирую с более связанным кодом –

+0

У меня такая же проблема в проекте Swift. Кто-нибудь решает эту проблему? – nh32rg

ответ

2

Для тех, кто найти эту тему, вот решение, которое я нашел.

Моя проблема и ответ были специфическими для моего проекта.

У меня был другой контроллер, который заботится обо всех моих подключениях к базе данных, которые прослушивали applicationDidBecomeActive. Это вызывало обновление моих данных, а также «очистку», которая удаляла/редактировала некоторые NSManagedObjects, а затем сохраняла.

Заключение: адрес памяти не был одинаковым, объект не считался одним и тем же, поэтому на моей текущей странице был пуст.

Я исправил это, прекратив очистку каждого AppDidBecomeActive, но вместо этого переместил эту логику в AppDidFinishLaunching.

Надеюсь, что помогло!

+1

Я делал что-то подобное, о котором я забыл, и ваш отзыв напомнил мне! Спасибо за помощь. – nh32rg

+0

спасибо за подсказку, это помогло – OthmanT