2011-10-14 19 views
6

Cuando intento obtener el identificador de un EKEvent, todo lo que obtengo es un valor nulo. Dado que en iOS5 EKEvent es una subclase de EKCalendarItem, pensé que podría obtener el UUID de EKCalendarItem, pero eso también devuelve nada.EKEvent eventIdentifier devuelve nulo

De vez en cuando también me sale este error al intentar acceder a la propiedad o el identificador 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)" 

He estado atrapado en este problema desde hace bastante tiempo, pero pensé que sería IOS5 relacionado con beta. Pero dado que ahora estamos en iOS5, todavía no está funcionando.

Respuesta

7

Cuando intento para obtener el identificador de un EKEvent, lo único que consigue es un valor nulo

tratar de salvar y se comprometan su evento antes de recuperar el identificador:

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

En mi aplicación descubrí que si solicita el eventIdentifier cuando se ha liberado eventStore que lo recuperó, devuelve nil. Pero si solicita el EventIdentifier antes de que devuelva el id correcto. A continuación, puede liberar la instancia EKEventStore y solicitar el identificador sin ningún problema ... Parece que necesita el eventStore para recuperar el ID, pero no recibo ninguna advertencia.

+0

Recibo esta advertencia, y descubrí que estaba lanzando mi EKEventStore demasiado pronto. Ahora, lo sostengo hasta que termine con mis EKEvents, y todo está bien. Obtengo mis datos y no tengo advertencias. –

+1

Esto debería ser parte de la documentación de Apple. – Dare2Dream

+0

Esto es realmente problemático en combinación con ARC.Gracias por tu excavación, eso me hubiera llevado una cantidad de tiempo mínima de encontrar. –

2

EventIdentifier se establece cuando el evento se agrega a EKEventStore. Si intenta acceder a este valor antes de agregarlo, devolverá nulo.

+1

¿cómo puedo saber que este proceso asíncrono, es decir, agregar eventos al calendario, terminó o el proceso de confirmación al DB finalizó? porque todavía me estoy volviendo nulo incluso después de intentar acceder después de saveEvent Sentence –

2

sólo está pasando por este problema, la participación del eventIdentifier será nula antes de comprometerse a la base de datos, por lo que necesita una confirmación: YES en la función saveEvent [self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];

Después de eso, se puede obtener el EventIdentifier.

Mi error fue pasar un NO a confirmar: parámetro.

+0

cómo puedo saber que este proceso asíncrono, es decir, agregar evento al calendario, terminó o el proceso de confirmación para DB finalizó? porque todavía me estoy volviendo nulo incluso después de intentar acceder después de saveEvent Sentence –

+0

I a través de él será una llamada de sincronización si add commit: YES parameter, ¿usa dos hilos para acceder al eventIdentifier y guardarlo? –

+0

sí, ya lo hice y funciona gracias –

0

Para mí, el eventIdentifier es nulo porque no estaba configurando el endDate. Por lo tanto, generalmente el eventIdentifier puede ser nulo si hay algún error al crear ese evento. Puede comprobar si hay errores como este:

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

El EKEvent eventIdendifier no se genera hasta que se guarde el evento. Puede acceder/guardar la EventIdentifier después de haber guardado el evento a la EKEventStore

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

Para Swift 3

he descubierto, que la cuestión era que yo he creado la tienda dentro de la función que recupera la fecha.

Crear la tienda fuera de la función y usar su instancia resolvió el 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) 

      } 

     } 

    } 

} 
Cuestiones relacionadas