【问题标题】:How to return the EKEvent.identifier right after saving it to the EKEventStore?如何在将 EKEvent.identifier 保存到 EKEventStore 后立即返回?
【发布时间】:2019-01-04 13:49:31
【问题描述】:

我想写一个方法,它接受一个事件对象,它有一个名称和一个日期参数。该函数请求访问/检查对事件存储的访问,使用参数创建一个 EKEvent,将其保存到存储中,然后将事件标识符作为字符串返回。

到目前为止,我遇到了麻烦,因为 eventStore.requestAccess(To:) 方法闭包转义,并且在实际创建 EKEvent 对象并将其保存到存储之前返回字符串。

我的方法位于我的 EventHelper 类的代码中,这是我的 EventStore 和 Apples EKEventStore 之间的抽象层。

import EventKit

struct Event {
    var name: String
        var date: Date
    var id: String?
}

class EventHelper {

    // MARK: Properties
    var store: EKEventStore!

    // MARK: Methods
    func createCalendarEvent(for event: Event) -> String? {
        // Prepare a place to store the eventIdentifier
        var identifier : String?

        // Get acces to the eventstore
        store.requestAccess(to: .event) { (granted, error) in

            if (granted) && (error == nil) {

                    print("Calendar event creation.")
                    print("granted: \(granted)")
                    print("error: \(String(describing: error))")

                    // Create a new event kit event
                    let newEvent = EKEvent(eventStore: self.store)
                    newEvent.title = event.name
                    newEvent.startDate = event.date

                    // Create a timeinterval for the end date
                    let twoHourTimeInterval = TimeInterval(exactly: 7200)
                    newEvent.endDate = event.date.addingTimeInterval(twoHourTimeInterval!)


                    // choose the calender the event should be assinged to
                    newEvent.calendar = self.store.defaultCalendarForNewEvents

                    // try to save the new event in the event store
                    do {
                        try self.store.save(newEvent, span: .thisEvent, commit: true)
                        identifier = newEvent.eventIdentifier
                        print("Saved event with ID: \(String(describing: newEvent.eventIdentifier))")
                     // The event gets created and the ID is printed to the console but at a time when the whole function already has returned (nil)
                    } catch let error as NSError {
                        print("Failed to save event with error: \(error)")
                    }
            }
            else {
                print("Failed to save event with error \(String(describing: error)) or access not granted")
            }
        }
        print("new Event: \(String(describing: identifier))")
        return identifier
    }
}

【问题讨论】:

    标签: swift eventkit ekevent


    【解决方案1】:

    我找到了解决办法!

    而不是使用.requestAccess(to:completion:) 来创建事件。我只在明确需要访问 EKEventStore 时才使用它。 并检查我是否打开了.authorizationStatus(for:)

    代码来了:

    import EventKit
    
    class EventHelper {
    
        // MARK: Properties
        var store: EKEventStore!
    
    
        // MARK: Methods
        /*
         This thing I got from here     https://stackoverflow.com/questions/28379603/how-to-add-an-event-in-the-device-calendar-using-swift more or less
         */
        func createCalendarEvent(for event: Event) -> String? {
            // Act base upon the current authorisation status
            switch EKEventStore.authorizationStatus(for: .event) {
            case EKAuthorizationStatus.notDetermined:
                // Ask for permission
                requestAuthorisationToCalendar()
    
                // And try again
                return try createCalendarEvent(for: event)
    
            case EKAuthorizationStatus.denied:
                print("Access to the Event Store was denied.")
    
            case EKAuthorizationStatus.restricted:
                print("Access to the Event Store was restricted.")
    
            case EKAuthorizationStatus.authorized:
                // Create a new event
                let newEvent = EKEvent(eventStore: store)
                newEvent.title = event.name
                newEvent.startDate = event.date
    
                // Create a timeinterval for the end date
                let twoHourTimeInterval = TimeInterval(exactly: 7200)
                newEvent.endDate =     event.date.addingTimeInterval(twoHourTimeInterval!)
    
                // choose the calender the event should be assinged to
                newEvent.calendar = self.store.defaultCalendarForNewEvents
    
                // try to save the new event in the event store
                do {
                try self.store.save(newEvent, span: .thisEvent, commit: true)
                print("Saved event with ID: \(String(describing: newEvent.eventIdentifier))")
                    return newEvent.eventIdentifier
                } catch let error as NSError {
                    print("Failed to save event with error: \(error)")
                    return nil
                }
            }
        }
    
        // MARK: Privat Methods
        private func requestAuthorisationToCalendar() {
            store.requestAccess(to: .event) { (granted, error)  in
                if (granted) && (error == nil) {
                    DispatchQueue.main.async {
                        print("User has granted access to calendar")
                    }
                } else {
                    DispatchQueue.main.async {
                        print("User has denied access to calendar")
                    }
                }    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多