究竟什么构成了EKCalendar中的"完整日历同步"?

use*_*469 20 calendar objective-c ios eventkit

EKCalendar该类的文档为该calendarIdentifier属性声明了这一点:

与日历完全同步将丢失此标识符.您应该有一个计划,通过缓存其他属性来处理标识符不再可读的日历.

什么时候发生"完全同步"以及哪些属性可能会发生变化calendarIdentifier

Vla*_*pko 5

“完全同步”究竟何时发生?
Calendar and Reminders Programming Guide 这样解释这个问题:

如果您的应用程序外部发生对日历数据库的更改,Event Kit 能够通过通知检测到更改,以便您的应用程序可以采取适当的行动。使用 Event Kit 对日历项目所做的更改会 自动同步到关联的日历(CalDAV、Exchange 等)。

当您的应用程序打开时,我看到“完全同步”事件的此类场景:
1.用户将您的应用程序发送到后台并打开日历应用程序。他更改日历名称,添加/编辑/删除事件,甚至删除一些日历。
2.用户在 Mac 上对 iCloud 日历应用了一些更改。通知 iOS 设备 iCloud 日历已更改,因此必须同步。
3.第三方应用收到无提示通知,iOS在后台启动,应用根据通知创建一些日历事件。

一般来说,这意味着“完全同步”事件可以随时发生。

如何检测和处理“完全同步”事件?
Observing External Changes to the Calendar Database以这种方式解释了这个问题:

另一个进程或应用程序可能会在您的应用程序运行时修改日历数据库。如果您的应用程序获取日历事件或提醒,您应该注册以收到有关 日历数据库更改的通知。通过这样做,您可以确保您向用户显示的日历和提醒信息是最新的。

这是用于注册此类通知的代码示例:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(storeChanged:)
                                             name:EKEventStoreChangedNotification
                                           object:eventStore];
Run Code Online (Sandbox Code Playgroud)

我认为重新创建EKCalendar类的实例并calendarIdentifier在需要时重新缓存是有意义的。

除了 calendarIdentifier 之外,还有哪些属性可能会发生变化?
我找不到有关此问题的任何文档。但由于日历有时甚至不存在(例如用户在日历应用程序中手动删除它),那么EKCalendar在“完全同步”事件发生后,对象的任何属性都可能无效。

阅读以上链接以获取更多信息和细节也很有意义。


jua*_*mjr 0

根据 iTunes 论坛,未指定何时完全同步,取决于它们:

http://www.openradar.appspot.com/15671424

https://idmsa.apple.com/IDMSWebAuth/login?appIdKey=4a75046cda87eab6386a9eae8caabb9824e328b9abc988119b39296495ec184c&path=/login.jspa#926856

与易于更改的属性相关的是所有可以由其他线程访问的属性(与 相同calendarIdentifier),因此那些是非原子的并且可以更改的属性,这里是我可以找到的属性:

allowsContentModifications, CGColor, immutable,title,type,allowedEntityTypes,source,subscribed,supportedEventAvailabilities
Run Code Online (Sandbox Code Playgroud)