# EventKitメモ. データ取得

# EKCalendar (カレンダー/リスト)

  • カレンダ用かリマインダ用かを引数に指定して `一覧を取る
  • カレンダは「カレンダ(職場、自宅 etc)」に相当、リマインダは「リスト」に相当
let calendars = store.calendars(for: .reminder)

for calendar in calendars {
    print(calendar.title)
}

# EKEvent (カレンダーのEvent)

  • NSPredicate で期間を指定して取る
let predicate: NSPredicate = store.predicateForEvents(
    withStart: getNDaysAgo(365),
    end: getNDaysAgo(0),
    calendars: getCalendars()
)
let events: [EKEvent] = store.events(matching: predicate)

for event in events {
    print(event.title)
}

# EKReminder (リマインダ)

  • NSPredicate で「リスト(calendar)」を指定して取る
  • fetch 系の関数で Complete のもの / Incomplete のもの / 全部、の3種類

WARNING

カレンダーと違って非同期なので、何かしらコールバック的なのを呼んでやる必要がある

  • TODO: @escaping は警告にしたがってつけたけど、文法を後で調べておく
static func parseReminders(calendar: EKCalendar, onComplete: @escaping (_ tree: ReminderTree) -> Void) {
    let predicate: NSPredicate? = store.predicateForReminders(in: [calendar])

    store.fetchReminders(matching: predicate!) { reminders in
        for reminder in reminders! {
            print(reminder.title!)
        }
        onComplete(r) // (2) コールバックを用意
    }
    // (1) ここでは 結果は読めない
}

最初非同期であることに気づかず、次のような書き方をしてハマってしまった。

let todos: [EKReminder] = []

store.fetchReminders(matching: predicate!) { reminders in
    for reminder in reminders! {
        if (...) {
            todos.append(reminder)
        }
    }
}

print(todos.count) // 0件。ない!

[ 📩 ご意見 ]