Когда именно происходит "полная синхронизация"?
Руководство по программированию календаря и напоминаний объясняет эти вопросы следующим образом:
Если изменение в базе данных календаря происходит из-за пределов вашего приложения, Event Kit может обнаружить изменение с помощью уведомления, чтобы ваше приложение могло действовать соответствующим образом. Изменения, внесенные в элементы календаря с помощью Event Kit, автоматически синхронизируются с соответствующим календарем (CalDAV, Exchange и т. д.).
Я вижу такие сценарии событий «полной синхронизации», когда ваше приложение открыто:
1. Пользователь переводит ваше приложение в фоновый режим и открывает приложение «Календарь». Он меняет имя календаря, добавляет/редактирует/удаляет события или даже удаляет некоторые календари.
2. Пользователь вносит некоторые изменения в календарь iCloud на Mac. Устройство iOS получает уведомление о том, что календарь iCloud был изменен, поэтому его необходимо синхронизировать.
3. Стороннее приложение получает тихое уведомление, iOS запускает его в фоновом режиме, приложение создает какое-либо событие календаря на основе уведомления. .
В общем случае это означает, что событие «полная синхронизация» может произойти в любое время.
Как обнаружить и обработать событие полной синхронизации?
Наблюдение за внешними изменениями в базе данных календаря объясняет этот вопрос следующим образом:
Другой процесс или приложение может изменить базу данных календаря во время работы вашего приложения. Если ваше приложение получает события календаря или напоминания, вы должны зарегистрироваться, чтобы получать уведомления об изменениях в базе данных календаря. Тем самым вы гарантируете, что информация календаря и напоминаний, которую вы показываете пользователю, актуальна.
Вот пример кода для регистрации на такое уведомление:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storeChanged:)
name:EKEventStoreChangedNotification
object:eventStore];
Я думаю, что имеет смысл воссоздать экземпляры классов EKCalendar
и перекэшировать calendarIdentifier
, если это необходимо.
Какие свойства могут измениться, кроме calendarIdentifier?
Я не могу найти никакой документации по этому вопросу. Но поскольку календарь может даже не существовать в какой-то момент (например, пользователь вручную удаляет его в приложении «Календарь»), любое свойство объекта EKCalendar
может быть недействительным после того, как произойдет событие «полная синхронизация».
Также имеет смысл прочитать приведенные выше ссылки для получения дополнительной информации и деталей.
person
Vlad Papko
schedule
25.07.2015
calendarWithIdentifier
. Итак, если вы кэшировалиcalendarIdentifier
, это не будет иметь никакого смысла. Вы должны либо получить доступ к календарю iCloud или, как предлагает документация, кэшировать значения тех свойств календаря, которые вы хотите использовать позже. - person Hadi Brais   schedule 24.07.2015