爲了達到#1或者是後臺任務定期檢查新/更新的事件,或能以編程方式訂閱某種事件總線的日曆中的任意日曆更新(新事件,事件的變化)
你可以做以下事情。
首先要檢查新的/更新的日曆事件,我們不需要運行任何後臺任務。
我們可以使用.EKEventStoreChanged
通知獲取日曆事件的更新,如viewWillAppear
方法中所示。
NotificationCenter.default.addObserver(self, selector: #selector(eventStoreChanged:), name: .EKEventStoreChanged, object: eventStore)
處理日曆事件更改(新/更新)EKEventStore
更改如下所示。
func eventStoreChanged(_ notification: Notification) {
let ekEventStore: EKEventStore? = notification.object
let now = Date()
let offsetComponents = DateComponents()
offsetComponents.day = 0
offsetComponents.month = 4
offsetComponents.year = 0
let endDate: Date? = Calendar.current.date(byAddingComponents: offsetComponents, to: now, options: [])
let ekEventStoreChangedObjectIDArray: [Any]? = (notification.userInfo?["EKEventStoreChangedObjectIDsUserInfoKey"] as? [Any])
let predicate: NSPredicate? = ekEventStore?.predicateForEvents(withStartDate: now, endDate: endDate, calendars: nil)
// Loop through all events in range
ekEventStore?.enumerateEvents(matchingPredicate: predicate, usingBlock: {(_ ekEvent: EKEvent, _ stop: Bool) -> Void in
// Check this event against each ekObjectID in notification
(ekEventStoreChangedObjectIDArray as NSArray).enumerateObjects(usingBlock: {(_ ekEventStoreChangedObjectID: String, _ idx: Int, _ stop: Bool) -> Void in
let ekObjectID: NSObject? = (ekEvent as? NSManagedObject)?.objectID
if ekEventStoreChangedObjectID.isEqual(ekObjectID) {
// EKEvent object is the object which is changed.
stop = true
}
})
})
}
因此,每當有任何事件更改(添加/更新/刪除),我們可以得到更新。
此外,當您創建任何事件時,您會從EKEvent
對象獲得eventIdentifier
。
let eventStore : EKEventStore = EKEventStore()
eventStore.requestAccess(to: .event) { (granted, error) in
if (granted) && (error == nil) {
print("granted \(granted)")
print("error \(error)")
let event:EKEvent = EKEvent(eventStore: eventStore)
event.title = "Event"
event.startDate = Date()
event.endDate = Date()
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
} catch let error as NSError {
print("failed to save event with error : \(error)")
}
print("Saved Event id : \(event.eventIdentifier)")
}
else{
print("failed to save event with error : \(error) or access not granted")
}
}
並使用以下方法獲取事件。
let event:EKEvent = eventStore?.event(withIdentifier: eventIdentifier)
請讓我知道如果您需要任何更多的澄清。
關於您的問題「或以編程方式訂閱某種事件總線的能力任何日曆更新」您是否需要特定日曆的事件更新,或者您需要iOS設備中所有可用日曆的事件更新?我可否知道目的爲什麼你需要更新?我認爲這可以清楚地表明你想要做什麼。 –
@JayeshSojitra偉大的問題,現在只需一個日曆就足夠了。雖然我想添加多個「規則」,例如「對於日曆X,如果事件來自組織者Y,則在會議前使用聲音Z,n0,n1,n2分鐘」 –
哇,我非常感謝所有答案,但現在我遇到了一些問題。 ..我不知道如何排名他們,我將不得不嘗試一切,可悲的是我只有3天...再次感謝大家... –