How I can fix error "No start date has been set"?

229 Views Asked by At

When saving an event in the regular calendar, the events are sometimes not saved. An error is displayed: "failed to save event with error: Error Domain = EKErrorDomain Code = 2" No start date has been set. "UserInfo = {NSLocalizedDescription = No start date has been set.}", Although the date is determined correctly

func saveTaskInCalendar() {
        let eventStore : EKEventStore = EKEventStore()
        eventStore.requestAccess(to: .event) { (granted, error) in
            if (granted) && (error == nil) {
                let event: EKEvent = EKEvent(eventStore: eventStore)
                DispatchQueue.main.async {
                    event.title = "Test"
                    event.startDate = Date()
                    event.endDate = Date()
                }
                event.calendar = eventStore.defaultCalendarForNewEvents
                do {
                    try eventStore.save(event, span: .thisEvent)
                } 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")
            }
        }
    }

How do I fix this error?

1

There are 1 best solutions below

0
On BEST ANSWER

The problem is that you wrap setting the properties of the EKEvent in a dispatch async block, while you save the even outside the async block. This can cause the property setting to be executed after you've already tried saving the event.

Either remove the DispatchQueue.main.async call, since it shouldn't be necessary anyways or put the saving code inside the dispatch async as well.

let event: EKEvent = EKEvent(eventStore: eventStore)
event.title = "Test"
event.startDate = Date()
event.endDate = Date()
event.calendar = eventStore.defaultCalendarForNewEvents
do {
    try eventStore.save(event, span: .thisEvent)
}

or

DispatchQueue.main.async {
    let event: EKEvent = EKEvent(eventStore: eventStore)
    event.title = "Test"
    event.startDate = Date()
    event.endDate = Date()
    event.calendar = eventStore.defaultCalendarForNewEvents
    do {
        try eventStore.save(event, span: .thisEvent)
    }
...