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,
Potrebbe provare 'se event.hasAttendees && event.attendees = nil {'!? – rintaro
@rintaro buona cattura, controllerò. Se smetterò di seguire Eccezione ti farò sapere per pubblicare il commento come risposta. grazie –
in Swidt 2.0 implementerà try/catch –