EKEventStore.fetchReminders очень медленно использует его в первый раз - PullRequest
0 голосов
/ 07 февраля 2019

В macOS я загружаю напоминания, используя EventKit.Все работает, но при первой загрузке напоминаний во время выполнения это занимает больше времени, чем после этого.Это означает, что пользователь должен ждать после запуска приложения, чтобы увидеть какие-либо напоминания, что не так приятно.Нативное приложение Reminders работает быстрее.

Вот некоторый код:

import Cocoa
import EventKit

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!
    let semaphore = DispatchSemaphore(value: 0)

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        testReminders()
    }

    func testReminders() {
        let eventStore = EKEventStore()
        let incompletePredicate = eventStore.predicateForIncompleteReminders(withDueDateStarting: Date(), ending: Date(), calendars: nil)

        // Get the access permission first
        eventStore.requestAccess(to: .reminder, completion: { (granted, error) in
            // Now test
            self.semaphore.signal()
            for _ in 0..<10 {
                self.startMeasuring(eventStore, predicate: incompletePredicate)
            }
        })
    }

    func startMeasuring(_ eventStore: EKEventStore, predicate: NSPredicate) {
        semaphore.wait()
        let start = DispatchTime.now()

        // Get the reminders
        eventStore.fetchReminders(matching: predicate, completion: { (incompletedReminders: [EKReminder]?) -> Void in
            let end = DispatchTime.now()

            // Print out the elapsed time
            let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
            let timeInterval = Double(nanoTime) / 1_000_000_000
            print("elapsed: \(timeInterval)")

            self.semaphore.signal()
        })
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}

Если вы работаете над кодом, убедитесь, что вы отметили «Календарь» в «App Sandbox» Возможности.

Вот выходные данные в секундах:

прошло: 9.322825215
прошло: 0.045737709
прошло: 0.036359244
прошло: 0.03218976
1014 * 1015998467* прошло: 0,034777283
прошло: 0,032737581
прошло: 0,04387221
прошло: 0,03941968
прошло: 0,044008471

9 секунд слишком долго.Как я могу это исправить?

...