EKEventStore вызывает сбой SpringBoard

Я создаю приложение, которое извлекает события из календаря (с помощью EKEventStore predicateForEventsWithStartDate:endDate:calendars:) и синхронизирует события приложений с календарями (с помощью EKEventStore saveEvent:span:commit:error:).

Я использую статическую ссылку на EKEventStore и удостоверяюсь, что EKEventStore не используется одновременно разными моими процессами.

Приложение иногда завершается сбоем Springboard на IOS7. Вот предыстория крушения.

Last Exception Backtrace:
0   CoreFoundation                  0x18625e950 __exceptionPreprocess + 132
1   libobjc.A.dylib                 0x1927641fc objc_exception_throw + 60
2   CoreFoundation                  0x18625e810 +[NSException raise:format:arguments:] +     116
3   Foundation                      0x186d96db4 -[NSAssertionHandler     handleFailureInMethod:object:file:lineNumber:description:] + 112
4   EventKit                        0x186adab84 -[EKEventStore _addFetchedObjectWithID:] + 240
5   EventKit                        0x186adaa64 __78-[EKEventStore registerFetchedObjectWithID:withDefaultLoadedProperties:inSet:]_block_invoke + 96
6   libdispatch.dylib               0x192d3bfd4 _dispatch_client_callout + 16
7   libdispatch.dylib               0x192d41c84 _dispatch_barrier_sync_f_invoke + 48
8   EventKit                        0x186ada990 -[EKEventStore     registerFetchedObjectWithID:withDefaultLoadedProperties:inSet:] + 148
9   EventKit                        0x186ae1458 __41-[EKPredicateSearch startWithCompletion:]_block_invoke + 796
10  EventKit                        0x186ae1050 -[EKDaemonConnection _processReplyWithID:data:finished:] + 220
11  EventKit                        0x186ae0f5c CADReceiveReply + 136
12  EventKit                        0x186ae0eac _XReply + 124
13  EventKit                        0x186ae0e04 ClientCallbacks_server + 100
14  libdispatch.dylib               0x192d3fae8 dispatch_mig_server + 352
15  EventKit                        0x186ae0d6c __43-[EKDaemonConnection initWithOptions:path:]_block_invoke16 + 44
16  libdispatch.dylib               0x192d3bfd4 _dispatch_client_callout + 16
17  libdispatch.dylib               0x192d3db90 _dispatch_source_invoke + 500
18  libdispatch.dylib               0x192d430f4 _dispatch_root_queue_drain + 104
19  libdispatch.dylib               0x192d434fc _dispatch_worker_thread2 + 76
20  libsystem_pthread.dylib         0x192ed16bc _pthread_wqthread + 356
21  libsystem_pthread.dylib         0x192ed154c start_wqthread + 4

Вот мой код, инициализирующий мой ekeventstore:

+ (EKEventStore *) sharedStore {
     static EKEventStore *sharedEventStore;

    if (sharedEventStore == nil) {
        sharedEventStore = [[EKEventStore alloc] init];
        [sharedEventStore requestAccessToEntityType: EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        }];
        [sharedEventStore reset];
    }

    return sharedEventStore;
}

Код для получения событий:

NSPredicate *predicate = [[CalendarHelper sharedStore] predicateForEventsWithStartDate:startDate
                                                        endDate:endDate
                                                      calendars:[[showableCalendars copy] autorelease]];
NSArray *result = [[CalendarHelper sharedStore] eventsMatchingPredicate:predicate];

И для обновления/создания событий:

EKEvent *event = [[CalendarHelper sharedStore] eventWithIdentifier:eventId];
if(event != nil) {
    event.title = title;
    event.startDate = startDate;
    event.endDate = endDate;
    NSLog(@"Updating...");
    NSLog(@"+++ %@", event.eventIdentifier);

    [[CalendarHelper sharedStore] saveEvent:event span:EKSpanThisEvent commit:commit error:nil];
    NSLog(@"Updated.");
}
else {
    NSLog(@"No event, no update");
}

Любая подсказка?


person Nico    schedule 14.04.2014    source источник
comment
Какой код вы использовали? Вы спрашивали разрешения сначала? requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)   -  person chrisblomm    schedule 14.04.2014
comment
Спасибо, Крис. Да, я сначала спросил разрешения, я отредактировал свой запрос выше, чтобы включить фрагменты кода.   -  person Nico    schedule 14.04.2014
comment
Когда приложение закрывается? Вы уже использовали точки останова, чтобы точно определить проблему?   -  person chrisblomm    schedule 14.04.2014
comment
Приложение чаще всего завершает работу через несколько мгновений (например, 1 секунду) после сохранения набора событий; иногда происходит сбой даже после того, как приложение было переведено в фоновый режим; Точки останова не кажутся решением для расследования, поскольку сбой очень сложно воспроизвести (приблизительно 1 раз из нескольких десятков)...   -  person Nico    schedule 14.04.2014


Ответы (1)


Пожалуйста, проверьте свою версию ios. Я столкнулся с подобным сбоем при работе с iOS 7.0.2, если это не так, попробуйте приведенный ниже код.

похоже, что причина этой ошибки связана с тем, сколько событий мы пытаемся получить в нашем приложении. Проверьте отчет об ошибке Apple (15424747).

Похоже, что эта ошибка возникает, когда наше приложение использует хранилище событий с большим диапазоном дат.

Вот код:

NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate     endDate:endDate calendars:nil]; 

//для сортировки использовали NSSortDescriptor

if (!self.masterListSortDescriptor)
{    
    self.masterListSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDate"  ascending:YES]; 
}

NSArray *result = [[self.eventStore eventsMatchingPredicate:predicate]
sortedArrayUsingDescriptors:@[self.masterListSortDescriptor]];
person abhi    schedule 15.04.2014
comment
у моего приложения есть предикатный диапазон 2 недели, как вы думаете, может ли это вызвать сбой (у меня есть похожее описание сбоя) - person Async-; 15.12.2016