Skip to content

Instantly share code, notes, and snippets.

@wata
Last active March 27, 2024 05:27
Show Gist options
  • Save wata/9deb3cc17bad012834f5a83eb94bfda4 to your computer and use it in GitHub Desktop.
Save wata/9deb3cc17bad012834f5a83eb94bfda4 to your computer and use it in GitHub Desktop.
Parse EKEventStoreChanged notification user info
struct EventStoreNotificationInfo {
let changeType: Int
let calendarDataChanged: Bool
let remindersDataChanged: Bool
let changedObjectIDs: [NSObject]
let modifiedObjectIdentifiers: Set<String>? // Not included in iOS 16?
struct UserInfoKeys {
static let changeType = "EKEventStoreChangeTypeUserInfoKey"
static let calendarDataChanged = "EKEventStoreCalendarDataChangedUserInfoKey"
static let remindersDataChanged = "EKEventStoreRemindersDataChangedUserInfoKey"
static let changedObjectIDs = "EKEventStoreChangedObjectIDsUserInfoKey"
static let modifiedObjectIdentifiers = "EKEventStoreModifiedObjectIdentifiers"
}
init?(_ userInfo: [AnyHashable: Any]?) {
guard
let changeType = userInfo?[UserInfoKeys.changeType] as? NSNumber,
let calendarDataChanged = userInfo?[UserInfoKeys.calendarDataChanged] as? NSNumber,
let remindersDataChanged = userInfo?[UserInfoKeys.remindersDataChanged] as? NSNumber,
let changedObjectIDs = userInfo?[UserInfoKeys.changedObjectIDs] as? [NSObject]
else { return nil }
self.changeType = changeType.intValue
self.calendarDataChanged = calendarDataChanged.boolValue
self.remindersDataChanged = remindersDataChanged.boolValue
self.changedObjectIDs = changedObjectIDs
modifiedObjectIdentifiers = userInfo?[UserInfoKeys.modifiedObjectIdentifiers] as? Set<String>
}
}
@wata
Copy link
Author

wata commented Nov 26, 2021

NotificationCenter.default.addObserver(forName: .EKEventStoreChanged, object: nil, queue: nil) { note in
    guard let info = EventStoreNotificationInfo(note.userInfo) else { return }
    print(info)
}

@wata
Copy link
Author

wata commented Sep 14, 2022

Updated: modifiedObjectIdentifiers changed to optional

@MiklinMA
Copy link

In this case I suggest an extension is quite easier to use

extension Notification {
    var changeType: Int? {
        (userInfo?["EKEventStoreChangeTypeUserInfoKey"] as? NSNumber)?.intValue
    }
    var calendarDataChanged: Bool? {
        (userInfo?["EKEventStoreCalendarDataChangedUserInfoKey"] as? NSNumber)?.boolValue
    }
    var remindersDataChanged: Bool? {
        (userInfo?["EKEventStoreRemindersDataChangedUserInfoKey"] as? NSNumber)?.boolValue
    }
    var changedObjectIDs: [NSObject]? {
        userInfo?["EKEventStoreChangedObjectIDsUserInfoKey"] as? [NSObject]
    }
    var modifiedObjectIdentifiers: Set<String>? {
        userInfo?["EKEventStoreModifiedObjectIdentifiers"] as? Set<String>
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment