对于我的应用,我必须在用户的iCloud帐户中创建一个日历,并将事件添加到该日历中。
我正在使用此创建日历:
let newCalendar = EKCalendar(forEntityType: EKEntityTypeEvent, eventStore: EventManager.sharedInstance.eventStore)
newCalendar.title = "MyAppCalendar"
let color = UIColor(red: CGFloat(arc4random_uniform(255))/255, green: CGFloat(arc4random_uniform(255))/255, blue: CGFloat(arc4random_uniform(255))/255, alpha: 1)
newCalendar.CGColor = color.CGColor
var mySource:EKSource?
for source in EventManager.sharedInstance.eventStore?.sources() as! [EKSource] {
if source.sourceType.value == EKSourceTypeCalDAV.value && source.title == "iCloud" {
mySource = source
break
}
}
if mySource == nil {
//crearting alert and displaying to user
return
}
else {
newCalendar.source = mySource!
}
var error:NSError?
if EventManager.sharedInstance.eventStore!.saveCalendar(newCalendar, commit: true, error: &error) {
let calendarName = newCalendar.title
let calendarIdentifier = newCalendar.calendarIdentifier
//save these in db and server
}else {
SharedConstants.handleErrors(error!)
}
EventManager
是我的类,以维护对EKEventStore
对象实例的引用。
但在Apple文档中,它表示calendarIdentifier会在同步时发生变化。
所以我的问题是如何保持对这个日历的引用?
答案 0 :(得分:2)
没有解决方案可以在100%的情况下使用,因为您知道可以更改calendarIdentifier
。因此,没有任何唯一的标识符会一直引用特定的日历
但是,有可能制定出适用于大多数情况的解决方案。我建议使用这种算法来引用特定的日历:
我认为您为自己的日历缓存了calendarIdentifier
和title
。
以下是上述算法的代码段:
func eventsCalendarWithIdentifier(identifier: String!, title: String!) -> EKCalendar? {
var calendarWithIdentifier: EKCalendar? = nil
var calendarWithTitle: EKCalendar? = nil
let eventStore = EventManager.sharedInstance.eventStore!
for aCalendar in eventStore.calendarsForEntityType(EKEntityTypeEvent) as! [EKCalendar] {
if var anIdentifier = aCalendar.calendarIdentifier {
if anIdentifier == identifier {
calendarWithIdentifier = aCalendar
break
}
}
if var aTitle = aCalendar.title {
if aTitle == title {
calendarWithTitle = aCalendar
}
}
}
return calendarWithIdentifier ?? calendarWithTitle
}
在潜在的完全同步发生时处理事件并重新创建日历实例也很重要。这很重要,因为用户可以在您的应用程序处于后台时删除您的日历,在这种情况下,日历将无效 以下是处理此类事件的代码段:
func registerObserver() {
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "storeChanged",
name: EKEventStoreChangedNotification,
object: nil)
}
func unregisterObserver() {
NSNotificationCenter.defaultCenter().removeObserver(self,
name: EKEventStoreChangedNotification,
object: nil)
}
func storeChanged() {
let myCalendar = self.eventsCalendarWithIdentifier(cachedIdentifier, title: cachedTitle)
if myCalendar == nil {
// Calendar lost.
}
// Updated UI if needed.
}