// Copyright © 2015 Abhishek Banthia import Cocoa import CoreLoggerKit import EventKit class EventCenter: NSObject { private static var shared = EventCenter() var eventStore: EKEventStore! var calendar: EKCalendar? var autoupdatingCalendar = NSCalendar.autoupdatingCurrent var eventsForDate: [Date: [EventInfo]] = [:] var filteredEvents: [Date: [EventInfo]] = [:] private let fetchQueue = DispatchQueue(label: "com.abhishek.fetch") @discardableResult class func sharedCenter() -> EventCenter { return shared } override init() { super.init() refetchAll() NotificationCenter.default.addObserver(self, selector: #selector(EventCenter.eventStoreDidChange(_:)), name: .EKEventStoreChanged, object: nil) } @objc func eventStoreDidChange(_: Any) { refetchAll() } deinit { // Just to be super safe NotificationCenter.default.removeObserver(self) } private func refetchAll() { Logger.info("\nRefetching events from the store") eventsForDate = [:] filteredEvents = [:] autoreleasepool { fetchQueue.async { // We get events for a 120 day period. // If the user uses a calendar often, this will be called frequently self.fetchEvents(-40, 80) } } } }