2013-12-05 5 views
0

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

Чтобы повторить, моя проблема здесь заключается в получении доступа к правильному ViewControllers, чтобы сохранить/загрузить данные с диска.

Моя навигация иерархия проста, ViewController > GameViewController (показано модально)

-(void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    // Save current state to disk 

    // See if GameViewController (or GameView) is top controller (aka game in progress) 
    // If so then use NSKeyedArchiver to persist to disk 
} 

-(void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    // Load current state from disk 

    // Use NSKeyedArchiver to load data from disk, if game is in progress then 
    // Find mainViewController, then show the game modal on top of it 
    // then populate the game data with the data from disk 
} 

Бонус вопрос: Являются ли эти две функции правильными, чтобы делать свою сохранение/загрузка в?

+0

Почему у вас нет только одного объекта viewController в вашем делете приложения? – Woodstock

+0

Как я могу это достичь? – Chris

+0

в файле заголовка для вашего делегата приложения (там, где указанными выше методы были бы) declare @property UIViewController * yourController; то вы можете получить доступ к своим VC по мере необходимости, и у вас всегда есть ссылка ... – Woodstock

ответ

0

lternatively вы можете настроить обработчик уведомлений, куда вы хотите/потребность в вашем коде:

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(handleEnteredBackground:) 
              name: UIApplicationDidEnterBackgroundNotification 
              object: nil]; 
0

Правильный способ решения этой проблемы является использование паттерна Model-View-Controller (MVC) - как (почти) все хорошие приложения COSA для iOS должны:

  • Прежде всего, убедитесь, что данные, которые вы хотите сохранить, сохраняются в вашем модельном слое/объекте.
  • Если состояния контроллера просмотра часто меняются, используйте уведомление: UIApplicationWillEnterBackgroundNotification в контроллерах вида в качестве триггера для сохранения состояния в модели.
  • Когда сообщение applicationDidEnterBackground: получено в делегате приложения, сохраните данные в объектах модели в файловой системе.
  • Когда приложение просыпается или перезапускается, загрузите данные файла обратно в модель и уведомите контроллеры представления с помощью специального уведомления, чтобы знать контроллеры представления, чтобы восстановить их соответствующие состояния.

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

+0

Привет, это имеет смысл, однако GameViewController «владеет» моделью GameEngine и в основном создает новый каждый раз, когда отображается представление, поэтому необходимо как-то дать/взять информацию из него – Chris

+0

Отлично, поэтому в ' Класс GameEngine' - если вы хотите изменить его - вы можете создать метод сохранения, который сохраняет его состояние в файл. Или, если вы не можете изменить его, в другом классе вы можете хранить коллекцию GameEngines (если их несколько) и иметь метод сохранения этого класса, который сохраняет состояния GameEngines в файле.Вышеупомянутый комментарий Мано Хахила предлагает аналогичный, но более ленивый способ сделать это. – gavdotnet

+0

Да, это мое, и да, я могу сделать это легко, я думаю, что теперь знаю, как это сортировать, я попробую немного, спасибо! – Chris