Регистрация на оповещение
Итак, при переходе приложения в фоновый режим будет вызван метод applicationDidEnterBackground: класса AppDelegate, но в нашем случае владелец данных — класс RootViewController. Регистрация RootViewController на оповещение UIApplicationDidEnterBackgroundNotifcation осуществляется по аналогии с тем, как это было сделано в AddDrinkViewControllerdid, разве что код регистрации и ее отмены включается в методы viewDidLoad и viewDidUnload, соответственно.
Код будет работать только в Simulator!
Код сохранения списка plist будет нормально работать в Simulator, но не на реальном устройстве. Проблемы возникают из-за разрешений доступа к файлам и того, где приложения могут хранить свои данные. Эта тема будет подробно рассмотрена в главе 8, но пока мы ограничимся этой версией. Это один из примеров различного поведения кода в Sumulator и на реальном устройстве.
Используя дискуссию Пети, Васи и Антона, а также ваши навыки работы с API, предложите возможную реализацию сохранения массива. Сохранение данных реализуется в файлах RootViewController.m и RootViewController.h.
Остановка и выполнение команды Build and Debug в Xcode НЕ ЭКВИВАЛЕНТНА нажатию Ноте и повторному запуску приложения в Simulator!
Останавливая приложение кнопкой Stop в Xcode, вы «убиваете» его на месте. Никаких оповещений о завершении, никакого сохранения. При выполнении команды Build and Debug среда Xcode заново устанавливает приложение на устройство перед запуском. Чтобы протестировать код загрузки и сохранения, перезапустите приложение при помощи значка в Simulator.
Значит, массивы умеют сохранять себя. Могу ли я просто поместить в массив произвольный объект, чтобы он был сохранен в списке plist?
Нет, произвольный объект не подойдет. Массивы загружаются и сохраняются с использованием технологии Cocoa, называемой NSCoding. Все загружаемые и сохраняемые объекты должны поддерживать протокол NSCoding, включающий методы initWithCoder и encodeWithCoder (по сути, операции загрузки и сохранения). Чтобы объекты могли сохраняться и восстанавливаться, вы должны обеспечить поддержку протокола NSCoding и реализовать эти методы. Классы NSDictionary поддерживают NSCoding (как и хранящиеся в них строки), что и позволяет нам так легко загружать и сохранять экземпляры этих классов.
Какой смысл давать код, который не будет работать на реальном устройстве? И что произойдет?
Чтобы узнать, что произойдет, проще всего запустить приложение на реальном устройстве. Затем подумайте, почему оно работает не так, как предполагалось. Эта тема более подробно рассматривается в следующей главе. А пока дадим подсказку: это связано с тем, где мы пытаемся сохранить данные. Кстати, это реальный пример кода, который по-разному работает в Simulator и на устройстве. Ваш код всегда должен тестироваться в обеих средах.
- Дата: 23-12-2014, 10:52