EKEventStore.fetchReminders首次使用非常慢

时间:2019-02-07 15:49:49

标签: swift macos calendar eventkit

在macOS上,我正在使用EventKit加载提醒。一切正常,但是在运行时第一次加载提醒时,它花费的时间比之后长。这意味着用户必须在启动应用程序后等待以查看任何提醒,这并不是很好。原生的提醒应用程序运行更快。

以下是一些代码:

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
    }
}

如果运行的是上述代码,请确保选中“应用程序沙箱”功能中的“日历”。

以下是输出(以秒为单位):

  

已过去:9.322825215
  播放时间:0.045737709
  拍摄时间:0.036359244
  播放时间:0.03218976
  拍摄时间:0.044998467
  拍摄时间:0.034777283
  播放时间:0.032737581
  播放时间:0.04387221
  拍摄时间:0.03941968
  过去了:0.044008471

9秒太长了。我该如何解决?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,似乎 Reminders sqlite 数据库需要真空/分析。我每次获取 12 秒,直到我这样做:

cd ~/Library/Reminders/Container_v1/Stores

sqlite <each .sqlite here>

VACUUM;
ANALYZE;
.quit