Проблемы с извлечением событий из EKEventStore - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь прочитать все события календаря из хранилища событий.Подпрограмма, которую я использую, работает иногда, но не всегда.

func getCalendarEvents(_ anfangOpt: Date?, _ endeOpt: Date?) -> [EKEvent]? {
    guard let anfang = anfangOpt, let ende = endeOpt else { return nil }
    var events: [EKEvent]? = nil
    let eventStore = EKEventStore()
    eventStore.requestAccess( to: EKEntityType.event, completion: { _,_ in })
    if EKEventStore.authorizationStatus(for: EKEntityType.event) == EKAuthorizationStatus.authorized {
        var predicate: NSPredicate? = nil
        predicate = eventStore.predicateForEvents(withStart: anfang, end: ende, calendars: nil)
        if let aPredicate = predicate {
            events = eventStore.events(matching: aPredicate)

        }
    }
    return events
}

Эта функция всегда возвращает события.Но они иногда неполны.Так что

for event in bereinigteEvents {
    if dateInInterval(prüfdatum, start: event.startDate, ende: event.endDate) {
        istimurlaub = true
        if let zwischenname = event.title {
            eventname = zwischenname
        } else {
            eventname = "n/a"
        }
        eventcalendar = event.calendar.title
        trigger.append ("Auslöser: „" + eventname + "“ im Kalender „" + eventcalendar + "“")
    }
}

иногда вылетает в строке "eventcalendar = event.calendar.title" и сообщении об ошибке, что "nil" был неожиданно найден.

Спасибо!

После первого ответа я изменил функцию, которая получает события следующим образом:

func getCalendarEvents(_ anfangOpt: Date?, _ endeOpt: Date?) -> [EKEvent]? {

    guard let anfang = anfangOpt, let ende = endeOpt else { return nil }
    var events: [EKEvent]? = nil
    let eventStore = EKEventStore()

    func fetchEvents() {
        var predicate: NSPredicate? = nil
        predicate = eventStore.predicateForEvents(withStart: anfang, end: ende, calendars: nil)
        if let aPredicate = predicate {
            events = eventStore.events(matching: aPredicate)
        }
    }

    if EKEventStore.authorizationStatus(for: EKEntityType.event) == EKAuthorizationStatus.authorized {
        fetchEvents()
    } else {
        eventStore.requestAccess( to: EKEntityType.event, completion: {(granted, error) in
            if (granted) && (error == nil) {
                fetchEvents()
                }
        })
    }
    return events
}

Но все равно происходит сбой с "неожиданно найденным нулем" в "event.calendar.title".

Я закончил тем, что использовал

Swift 4 Как получить все события из календаря?

подпрограмма для извлечения событий.

Проблема по-прежнемупроисходит иногда (!!): иногда «nil» встречается в «event.calender.title», хотя это не должно быть «nil»

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Проблема была в том, что event.calendar на самом деле является необязательным (о чем я не знал).

if let eventZwischenCal = event.calendar {
    eventcalendar = eventZwischenCal.title
} else {
    eventcalendar = "n/a"
}

решает проблему.

0 голосов
/ 29 января 2019

Строка

eventStore.requestAccess( to: EKEntityType.event, completion: { _,_ in })

бессмысленна, поскольку работает асинхронно.Результат запроса возвращается после проверки authorizationStatus в следующей строке.

Я рекомендую сначала проверить статус.Если доступ не предоставлен, запросите разрешение и выполните выборку.Если он предоставлен, выполните выборку напрямую.Это может быть достигнуто путем перемещения кода для извлечения событий в метод.

Примечание:

Кажется, что вы хотите извлечь события при вызове метода.Почему вы объявляете дату начала и окончания необязательной и проверяете nil?

Объявите

func getCalendarEvents(_ anfang: Date, _ ende: Date) -> [EKEvent]? { ...

, тогда вы получаете уведомление в время компиляции , является ли параметрnil.


PS: Deutsche Parameternamen mit Umlauten sehen sehr lustig aus.(Немецкие имена параметров с умлаутами выглядят довольно забавно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...