2016-06-29 5 views
0

Мое приложение вылетает с ошибкой EXC_BAD_ACCESS :(Это давало мне головную боль в течение нескольких дней. Сбой происходит, когда многократное нажатие и выскакивание .. UIViewController, который в свою очередь, делает выборку асинхронным CoreData Через 3-4 раза обычно бывает упрощенная ситуация выглядит следующим образом:.Сбой приложений (EXC_BAD_ACCESS) при повторном просмотре управления/push с помощью асинхронного ввода данных ядра

у меня есть UINavigationController с UIViewController как rootController Это UIViewController делает толчок, как это:

UINavigationController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"List"]; // List is the StoryboardID of another UIViewController. 
[self.navigationController pushViewController:controller animated:YES]; 

Далее, толкаемый UIViewController выполняет NSAsynchronousFetchR Equest так:

- (void)fetchData 
{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:self.entityName]; 
    fetchRequest.predicate = self.basePredicate; 

    __weak typeof(self) weakSelf = self; 

    // Initialize asynchronous fetch request. 
    NSAsynchronousFetchRequest *asynchronousFetchRequest = [[NSAsynchronousFetchRequest alloc] initWithFetchRequest:fetchRequest completionBlock:^(NSAsynchronousFetchResult *result) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      weakSelf.fetchedItems = [NSSet setWithArray:result.finalResult]; 
     }); 
    }]; 

    // Execute asynchronous fetch request. 
    [self.managedObjectContext performBlock:^{ 
     NSError *asynchronousFetchRequestError = nil; 
     [weakSelf.managedObjectContext executeRequest:asynchronousFetchRequest error:&asynchronousFetchRequestError]; 

     if (asynchronousFetchRequestError) { 
      DDLogError(@"Unable to execute asynchronous fetch result: %@, %@", asynchronousFetchRequestError, asynchronousFetchRequestError.localizedDescription); 
     } 
    }]; 
} 

Катастрофа EXC_BAD_ACCESS происходит только при установлении результатов на fetchedItems вар кажется. При удалении этой строки это не происходит, поэтому я подозреваю, что с этим что-то должно быть. Я тестировал с помощью «Включить объекты зомби», когда я включаю это приложение, не разбивается и не дает мне никакой дополнительной информации.

Любая помощь была бы принята с благодарностью!

+1

Существует хороший пример этого в следующем [ссылка] (https://www.bignerdranch.com/blog/new-in-core-data-and-iOS-8-asynchronous-fetching/). При этом он может иметь какое-то отношение к вам, используя GCD (т. Е. Вызов dispatch_async) вместо использования NSPersistentStoreAsynchronousFetchResultCompletionBlock для блока завершения, как в примере. – dean

+0

Я пробовал это, и, похоже, это не изменило ситуацию. Тем не менее, статья действительно была полезной и привела меня к поиску рабочего решения (до сих пор). Благодаря! – Tonnie

ответ

0

Ссылка на комментарий deanware почему-то заставила меня найти решение. По крайней мере, пока это работает правильно. Должен признаться, основные данные и многопоточность по-прежнему являются большой проблемой для меня с большим количеством проб/ошибок. Следующее решение моей проблемы и я надеюсь, что когда-нибудь полностью поймут, почему.

я заменил:

_managedObjectContext = [RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext; 

по:

_managedObjectContext = [[RKManagedObjectStore defaultStore] newChildManagedObjectContextWithConcurrencyType:NSMainQueueConcurrencyType tracksChanges:YES]; 

(я использую RestKit, кстати)