2011-10-14 16 views
6

Quando si tenta di ottenere l'identificatore di un EKEvent, tutto ciò che ottengo è un valore nullo. Poiché in iOS5 EKEvent è una sottoclasse di EKCalendarItem, ho pensato che avrei potuto ottenere l'UUID di EKCalendarItem, ma anche questo restituisce zero.EKEvent eventIdentifier restituisce null

Ogni tanto anche io ottengo questo errore durante il tentativo di accedere alla identificatore o la proprietà UUID:

CADObjectGetInlineStringProperty failed fetching uniqueID for EKPersistentEvent with error Error Domain=NSMachErrorDomain Code=268435459 "The operation couldn’t be completed. (Mach error 268435459 - (ipc/send) invalid destination port)" 

Sono stato bloccato su questo problema per un bel po 'di tempo, ma pensato che sarebbe stato iOS5 beta correlata. Ma dal momento che siamo ora su iOS5, non funziona ancora.

risposta

7

Quando provo ad ottenere l'identificatore di un EKEvent, tutto quello che ottiene è un valore nullo

tenta di salvare e impegnarsi vostro evento prima di recuperare l'identificatore:

[eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 
NSString *strId = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier]; 
7

In la mia app ha scoperto che se chiedi l'eventIdentifier quando è stato rilasciato l'eventStore che lo ha scaricato, restituisce zero. Ma se chiedi l'eventIdentifier prima che restituisca l'id ok. È quindi possibile rilasciare l'istanza EKEventStore e richiedere l'identificatore senza problemi .... Sembra che sia necessario che eventStore recuperi l'ID, ma non ricevo avvisi.

+0

Ho ricevuto questo avviso e ho scoperto che stavo rilasciando il mio EKEventStore troppo presto. Ora, lo tengo fino a quando non ho finito con il mio EKEvents, e tutto va bene. Ottengo i miei dati e non ho avvertimenti. –

+1

Questo dovrebbe essere parte della documentazione Apple. – Dare2Dream

+0

Questo è veramente problematico in combinazione con ARC.Grazie per la tua ricerca, mi ci sarebbe voluto un bel po 'di tempo da trovare. –

2

eventIdentifier viene impostato quando l'evento viene aggiunto a EKEventStore. Se si tenta di accedere a questo valore prima di aggiungerlo, restituirebbe null.

+1

come posso sapere che questo processo asincrono che aggiunge l'evento al calendario è terminato o il processo di commit in DB termina? perché sto ancora ottenendo nil anche dopo aver provato ad accedervi dopo la frase saveEvent –

2

Basta passare attraverso questo problema, l'affluenza del eventIdentifier sarà null prima impegnarsi a banca dati, quindi è necessario un impegno: YES nella funzione saveEvent [self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];

Dopo di che, si può ottenere l'EventIdentifier.

Il mio errore è stato passare un NO a commit: parametro.

+0

come posso sapere che questo processo asincrono che aggiunge l'evento al calendario è terminato o il processo di commit in DB termina? perché sto ancora ottenendo nil anche dopo aver cercato di accedervi dopo la frase saveEvent –

+0

I attraverso di esso sarà una chiamata di sincronizzazione se aggiungi commit: parametro YES, si utilizza due thread per accedere a eventIdentifier e salvarlo? –

+0

sì, l'ho già fatto e funziona grazie –

0

Per me, lo eventIdentifier è nullo perché non stavo impostando lo endDate. Quindi in genere lo eventIdentifier può essere nullo se ci sono errori nel creare quell'evento. È possibile verificare la presenza di errori come questo:

NSError *err = nil; 
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 
NSLog(@"Error : %@",err); 
0

L'EKEvent eventIdendifier non viene generato fino a quando viene salvato l'evento. È possibile accedere/memorizzare l'EventIdentifier dopo aver salvato l'evento al EKEventStore

[store saveEvent:event span:EKSpanThisEvent error:&err]; 
    NSString *eventIdentifier = event.eventIdentifier; 
0

Per Swift 3

ho scoperto che il problema era che io ho creato il negozio all'interno del funzione che recupera la data.

Creazione del negozio al di fuori della funzione e utilizzo della sua istanza risolto il problema.

class CalendarServices: NSObject { 

    var store = EKEventStore() 

    func fetchEventKitCalendarEvents(date: Date, completion: @escaping (_ events: [EKEvent]?, _ error: Error?)->()) { 

     let calendar = Calendar.current 

     guard self.getEventKitAuthorizationStatus() == .authorized else { 
      completion(nil, CoreServices.setError(message: "AuthorizationStatus != authorized")) 
      return 
     } 

     guard let endDate = calendar.date(byAdding: .day, value: 1, to: date) else { 
      completion(nil, CoreServices.setError(message: "Error creating endDate")) 
      return 
     } 

     CoreServices.background { 

      let predicate = self.store.predicateForEvents(withStart: date, end: endDate, calendars: self.fetchEventKitCalendars()) 

      let events = self.store.events(matching: predicate).sorted() { 
       (e1: EKEvent, e2: EKEvent) -> Bool in 
       return e1.startDate.compare(e2.startDate) == .orderedAscending 
      } 

      CoreServices.async { 

       completion(events, nil) 

      } 

     } 

    } 

}