2015-03-20 16 views
23

provo a caricare tutti gli eventi del calendario utilizzando block e volte (tasso 0,5%) ottengo NSInvalidArgumentException che causa il crash:Swift iOS EKEventStore: Recupero atendees da EKEvent fa sì che a volte in crash con NSInvalidArgumentException

var allCals = _eventStore.calendarsForEntityType(EKEntityTypeEvent) 

var predicate:NSPredicate! = _eventStore.predicateForEventsWithStartDate(yearsAgo, endDate:toAgo, calendars:allCals) 

_eventStore.enumerateEventsMatchingPredicate(predicate, usingBlock:{ 
      (event:EKEvent!, stop:UnsafeMutablePointer<ObjCBool>) in 

      if (event.title != nil 
       && event.calendar != nil 
       && event.calendar.calendarIdentifier != nil 
       && event.lastModifiedDate != nil 
       ){ 

         if event.attendees != nil{ // < -- SOMETIMES LEADS TO CRASH!! 
          //... 
         } 
         else{ // standalone 
          //... 
         } 
     } 

    //...... 
})// end block 

traccia dello stack completa: [discussione incidente + Eccezione]

Thread : Fatal Exception: NSInvalidArgumentException 
0 CoreFoundation     0x2917649f __exceptionPreprocess + 126 
1 libobjc.A.dylib    0x36970c8b objc_exception_throw + 38 
2 CoreFoundation     0x29096291 -[__NSSetM addObject:] + 608 
3 EventKit      0x29b4eacf -[EKPersistentObject primitiveRelationValueForKey:] + 502 
4 Foundation      0x29dc1617 -[NSObject(NSKeyValueCoding) valueForKey:] + 202 
5 EventKit      0x29b5afc5 -[EKObjectToManyRelation _loadedItems] + 120 
6 EventKit      0x29b5aef3 -[EKObjectToManyRelation _effectiveItems] + 102 
7 EventKit      0x29b5ae69 -[EKObjectToManyRelation items] + 20 
8 EventKit      0x29b5d179 -[EKCalendarItem attendees] + 36 
9 MyApp      0x000d8c78 _TTSf2n_n_n_n_n_d_i_n_n___TFFC8MyApp17WmBuildGroupsTask14doInBackgroundFS0_FT_T_U_FTGSqCSo7EKEvent_GVSs20UnsafeMutablePointerV10ObjectiveC8ObjCBool__T_ (WmBuildGroupsTask.swift:421) 
10 MyApp      0x000d3f3c _TPA__TTSf2n_n_n_n_n_d_i_n_n___TFFC8MyApp17WmBuildGroupsTask14doInBackgroundFS0_FT_T_U_FTGSqCSo7EKEvent_GVSs20UnsafeMutablePointerV10ObjectiveC8ObjCBool__T_ (WmBuildGroupsTask.swift) 
11 MyApp      0x000d96b8 reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.EKEvent>, @unowned Swift.UnsafeMutablePointer<ObjectiveC.ObjCBool>) -> (@unowned()) to @callee_unowned @objc_block (@unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.EKEvent>, @unowned Swift.UnsafeMutablePointer<ObjectiveC.ObjCBool>) -> (@unowned()) (WmBuildGroupsTask.swift) 
12 EventKit      0x29ba72a7 __60-[EKEventStore enumerateEventsMatchingPredicate:usingBlock:]_block_invoke + 130 
13 EventKit      0x29bad6af __41-[EKPredicateSearch startWithCompletion:]_block_invoke_2 + 690 
14 libdispatch.dylib    0x36ed07bb _dispatch_call_block_and_release + 10 
15 libdispatch.dylib    0x36ed9dab _dispatch_root_queue_drain + 866 
16 libdispatch.dylib    0x36edacd7 _dispatch_worker_thread3 + 94 
17 libsystem_pthread.dylib  0x37031e31 _pthread_wqthread + 668 
18 libsystem_pthread.dylib  0x37031b84 start_wqthread + 8 

Thread : Crashed: com.apple.root.default-qos 
0 libsystem_kernel.dylib   0x36fb6dfc __pthread_kill + 8 
1 libsystem_pthread.dylib  0x37034d37 pthread_kill + 62 
2 libsystem_c.dylib    0x36f56909 abort + 76 
3 libc++abi.dylib    0x362919c9 __cxa_bad_cast 
4 libc++abi.dylib    0x362ab671 default_unexpected_handler() 
5 libobjc.A.dylib    0x36970f25 _objc_terminate() + 192 
6 libc++abi.dylib    0x362a8de3 std::__terminate(void (*)()) + 78 
7 libc++abi.dylib    0x362a85a9 __cxxabiv1::exception_cleanup_func(_Unwind_Reason_Code, _Unwind_Exception*) 
8 libobjc.A.dylib    0x36970d5f objc_exception_throw + 250 
9 CoreFoundation     0x29096291 -[__NSSetM addObject:] + 608 
10 EventKit      0x29b4eacf -[EKPersistentObject primitiveRelationValueForKey:] + 502 
11 Foundation      0x29dc1617 -[NSObject(NSKeyValueCoding) valueForKey:] + 202 
12 EventKit      0x29b5afc5 -[EKObjectToManyRelation _loadedItems] + 120 
13 EventKit      0x29b5aef3 -[EKObjectToManyRelation _effectiveItems] + 102 
14 EventKit      0x29b5ae69 -[EKObjectToManyRelation items] + 20 
15 EventKit      0x29b5d179 -[EKCalendarItem attendees] + 36 
16 MyApp      0x000d8c78 _TTSf2n_n_n_n_n_d_i_n_n___TFFC8MyApp17WmBuildGroupsTask14doInBackgroundFS0_FT_T_U_FTGSqCSo7EKEvent_GVSs20UnsafeMutablePointerV10ObjectiveC8ObjCBool__T_ (WmBuildGroupsTask.swift:421) 
17 MyApp      0x000d3f3c _TPA__TTSf2n_n_n_n_n_d_i_n_n___TFFC8MyApp17WmBuildGroupsTask14doInBackgroundFS0_FT_T_U_FTGSqCSo7EKEvent_GVSs20UnsafeMutablePointerV10ObjectiveC8ObjCBool__T_ (WmBuildGroupsTask.swift) 
18 MyApp      0x000d96b8 reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.EKEvent>, @unowned Swift.UnsafeMutablePointer<ObjectiveC.ObjCBool>) -> (@unowned()) to @callee_unowned @objc_block (@unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.EKEvent>, @unowned Swift.UnsafeMutablePointer<ObjectiveC.ObjCBool>) -> (@unowned()) (WmBuildGroupsTask.swift) 
19 EventKit      0x29ba72a7 __60-[EKEventStore enumerateEventsMatchingPredicate:usingBlock:]_block_invoke + 130 
20 EventKit      0x29bad6af __41-[EKPredicateSearch startWithCompletion:]_block_invoke_2 + 690 
21 libdispatch.dylib    0x36ed07bb _dispatch_call_block_and_release + 10 
22 libdispatch.dylib    0x36ed9dab _dispatch_root_queue_drain + 866 
23 libdispatch.dylib    0x36edacd7 _dispatch_worker_thread3 + 94 
24 libsystem_pthread.dylib  0x37031e31 _pthread_wqthread + 668 

linea 9 a.e. WmBuildGroupsTask.swift:421 punti a questa riga if event.attendees != nil{.

Qualcuno può diffondere la luce su come sbarazzarsi di questo incidente o almeno rendere la sicurezza del codice da crash?

[EDIT 1]

ho provato anche:

if event.hasAttendees { 

    if let attArray:NSArray = event.attendees{ // crashes here 

    /* ... */ 
    }       

}

Interessante il fatto che da linea di comando: po event.hasAttendees rendimenti true

quando po event.attendees ritorno null. Ma si blocca ancora

[EDIT 2]

dopo l'aggiornamento a Swift 1.2 ottenere gli stessi crash (In Crashlytics). provato anche:

if event.hasAttendees { 

    if let attArray:[EKParticipant] = event.attendees as? [EKParticipant] // crash here 
{ 
    /* ... */ 
    }      
} 

L'evento problematico (s) si riferisce al calendario come Google e come ho già rilevato oltre il 99,5% dello stesso evento funziona correttamente e che il successo per andare a prendere i partecipanti.

Io non sono iOS Guru ma sembra che il suo problema iOS interna:

libobjc.A.dylib    0x36970d5f objc_exception_throw + 250 
9 CoreFoundation     0x29096291 -[__NSSetM addObject:] + 608 
10 EventKit      0x29b4eacf -[EKPersistentObject primitiveRelationValueForKey:] + 502 
11 Foundation      0x29dc1617 -[NSObject(NSKeyValueCoding) valueForKey:] + 202 
12 EventKit      0x29b5afc5 -[EKObjectToManyRelation _loadedItems] + 120 
13 EventKit      0x29b5aef3 -[EKObjectToManyRelation _effectiveItems] + 102 
14 EventKit      0x29b5ae69 -[EKObjectToManyRelation items] + 20 
15 EventKit      0x29b5d179 -[EKCalendarItem attendees] + 36 

Grazie,

+0

Potrebbe provare 'se event.hasAttendees && event.attendees = nil {'!? – rintaro

+0

@rintaro buona cattura, controllerò. Se smetterò di seguire Eccezione ti farò sapere per pubblicare il commento come risposta. grazie –

+0

in Swidt 2.0 implementerà try/catch –

risposta

8

Sembra abbastanza chiaro che si tratta di un bug in iOS e così si avrebbe bisogno un trucco per aggirarlo finché non lo risolvono.

Se si trattasse di Objective C, avrei utilizzato un blocco catch try per tentare di rilevare l'eccezione, quindi l'app non si arrestava.

Here s' un esempio di utilizzo di un blocco try a Swift, utilizzando un'implementazione C Obiettivo:

+0

Un buon approccio, lo controllerò, grazie, la tua risposta sarà accettata se sarà la soluzione migliore. Grazie, –

Problemi correlati