Разработка для Данных Значения ключа в iCloud

Для хранения дискретных значений в iCloud для предпочтений приложения конфигурация приложения или состояние приложения, использует хранение значения ключа iCloud. Хранение значения ключа подобно базе данных значений по умолчанию локального пользователя; но значения, которые Вы помещаете в хранение значения ключа, доступны каждому экземпляру Вашего приложения на всех различных устройствах пользователя. Если один экземпляр Ваших изменений приложений значение, другие экземпляры видят, что изменение и может использовать его для обновления их конфигурации, как изображено на рисунке 2-1.

Рисунок 2-1  хранение значения ключа iCloud

Увеличивая масштаб взаимодействий хранения значения ключа для единого устройства, как показано на рисунке 2-2, Вы видите что Ваше хранение значения ключа доступов приложения с помощью совместно используемого NSUbiquitousKeyValueStore объект.

Рисунок 2-2  обращение к памяти значения ключа iCloud

Поскольку Вы делаете с NSUserDefaults объект, используйте хранилище значения ключа iCloud, чтобы сохранить и получить скалярные значения (такой как BOOL) и типы объектов списка свойств: NSNumber, NSString, NSDate, NSData, NSArray, и NSDictionary. Массив и значения словаря могут содержать любой из этих типов значения. NSUbiquitousKeyValueStore класс обеспечивает методы для чтения и записи каждого из этих типов, как описано в Ссылке класса NSUbiquitousKeyValueStore.

Каждый раз, когда Вы пишете данные значения ключа, работа успешно выполняется или перестала работать атомарно; или все данные записаны, или ни один из него не. Можно использовать в своих интересах это поведение, когда приложение должно гарантировать, что ряд оценивает, сохраняется вместе для обеспечения законности: поместите взаимно зависимые значения в словаре и вызовите setDictionary:forKey: метод.

Включите хранение значения ключа

Прежде чем можно будет использовать хранение значения ключа, приложение должно иметь надлежащее право, как объяснено в Запрашивают Доступ к iCloud Используя Возможности XCode. И это - вся установка, в которой Вы нуждаетесь.

Подготовьте Свое Приложение для Использования Хранилища Значения ключа iCloud

Любое устройство, выполняющее Ваше приложение, и присоединенный к учетной записи iCloud пользователя, может загрузить изменения значения ключа в той учетной записи. Для отслеживания такие изменения зарегистрируйтесь для NSUbiquitousKeyValueStoreDidChangeExternallyNotification уведомление во время запуска приложения. Затем гарантировать Ваше приложение начинается с новейшими доступными данными, получите ключи и значения от iCloud путем вызова synchronize метод. (Вы никогда не должны вызывать synchronize метод снова во время жизненного цикла Вашего приложения, если Ваш проект приложения не требует быстрой-поскольку-возможный загрузки на iCloud после изменения значения.)

Следующий фрагмент кода показывает, как подготовить Ваше приложение для использования хранилища значения ключа iCloud. Код места как это в Вашем application:didFinishLaunchingWithOptions: метод (iOS) или applicationDidFinishLaunching: метод (OS X).

// register to observe notifications from the store
[[NSNotificationCenter defaultCenter]
    addObserver: self
       selector: @selector (storeDidChange:)
           name: NSUbiquitousKeyValueStoreDidChangeExternallyNotification
         object: [NSUbiquitousKeyValueStore defaultStore]];
 
// get changes that might have happened while this
// instance of your app wasn't running
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

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

Разрешение конфликтов значения ключа

Когда устройство, присоединенное к учетной записи iCloud, пытается записать значение в хранение значения ключа, проверки iCloud, чтобы видеть, были ли какие-либо недавние изменения внесены в хранилище значения ключа другими устройствами. Если никакие изменения не были недавно внесены, NSUbiquitousKeyValueStore возразите пишут незаконченные локальные изменения в сервере. Если изменения были недавно внесены, это не пишет локальные значения в сервер. Вместо этого это генерирует a NSUbiquitousKeyValueStoreDidChangeExternallyNotification уведомление, чтобы вынудить Ваше приложение обновить себя на основе обновленных значений сервера.

Когда Ваш обработчик для NSUbiquitousKeyValueStoreDidChangeExternallyNotification выполнения уведомления, проверьте новые значения, прибывающие из сервера, чтобы быть уверенными, что они целесообразны. Если новые данные не соответствуют локальное состояние Вашего приложения, рассматривают, могли ли бы данные, прибывающие из другого устройства, устареть. Например, если пользователь находится на уровне 13 игры на одном устройстве и на уровне 1 на другом устройстве, экземпляр игрового набора к уровню 13 мог бы хотеть записать свои изменения снова.

Пределы размера данных для хранения значения ключа

Общее пространство, доступное в хранении значения ключа iCloud Вашего приложения, составляет 1 МБ на пользователя. Максимальное количество ключей, которые можно указать, 1024, и предел размера для каждого значения, связанного с ключом, составляет 1 МБ. Например, если Вы храните единственное большое значение точно 1 МБ для единственного ключа, полностью использующего Вашу квоту для данного пользователя Вашего приложения. При хранении 1 КБ данных для каждого ключа можно использовать 1 000 пар ключ/значение.

Максимальная длина для строки ключа составляет 64 байта с помощью кодирования UTF8. Размер данных Ваших кумулятивных строк ключа не говорит против Вашей общей квоты на 1 МБ для хранения значения ключа iCloud; скорее Ваши строки ключа (которые в максимуме используют 64 КБ) говорят против общего выделения iCloud пользователя.

Если Ваше приложение превысило свою квоту в хранении значения ключа, хранилище значения ключа iCloud отправляет NSUbiquitousKeyValueStoreDidChangeExternallyNotification уведомление со значением NSUbiquitousKeyValueStoreQuotaViolationChange в его пользовательском информационном словаре.

Для больше о том, как использовать хранение значения ключа iCloud в Вашем приложении, посмотрите Предпочтения Хранения в iCloud в Руководстве по программированию Предпочтений и Настроек и обратитесь к Ссылке класса NSUbiquitousKeyValueStore.

Уход об осуществлении при использовании объектов NSData как значения

Несмотря на то, что можно поместить NSData возразите в хранилище значения ключа своего приложения, сделайте так экономно. Самой большой проблемой является пространство. Приложения могут сохранить только 1 МБ данных в их хранении значения ключа. Если Ваши объекты данных являются потенциально большими, Ваше приложение могло бы превысить свой предел хранения быстро. Таким образом, если Вы близко к пределу на 1 МБ, Вы могли бы хотеть рассмотреть хранение документов для тех данных вместо этого.

Каждый раз, когда Вы делаете мелочь большого объекта данных, весь объект данных должен быть отправлен в iCloud. Вместо того, чтобы связывать много данных в единственный объект данных, лучше повредить те данные в маленькие части и хранить те данные отдельно, предпочтительно с помощью более прозрачных типов, таких как числа и строки. Хранить данные более гранулировано с помощью других типов объектов списка свойств минимизирует объем данных, который должен быть передан, когда Вы вносите небольшие изменения.

Поскольку объекты данных являются пользовательскими объектами, только Ваше приложение знает, как считать их. Поскольку Вы вносите изменения в свои форматы данных, более старые версии Вашего приложения могли бы повредиться при попытке считать объекты данных, использующие новый формат. Чтобы препятствовать тому, чтобы более старые версии Вашего приложения повредились, Вы, возможно, должны были бы включать информацию о версии в объекты данных, как объяснено в Проекте для Устойчивости и Межплатформенной Совместимости.

Не используйте хранение значения ключа в определенных ситуациях

Каждое приложение, представленное App Store или App Store Mac, должно принять хранение значения ключа, но некоторые типы данных не являются подходящими для хранения значения ключа. В основанном на документе приложении, например, является обычно не надлежащим использовать хранение значения ключа для получения информации состояния о каждом документе, таком как текущая страница или текущий выбор. Вместо этого сохраните специфичное для документа состояние, по мере необходимости, с каждым документом, как описано в Проекте для Персистентного состояния Документа.

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