2016-06-29 21 views
0

Meine App stürzt mit einem EXC_BAD_ACCESS Fehler ab :(Seit ein paar Tagen habe ich Kopfschmerzen. Der Absturz passiert, wenn ich wiederholt a .. UIViewController, die wiederum nicht asynchron Coredata holen Nach 3-4 mal es geschieht in der Regel die vereinfachte Situation sieht wie folgt aus:.App stürzt ab (EXC_BAD_ACCESS) bei wiederholtem Viewcontroller push/pop mit asynchronen Core-Daten holen

ich eine UINavigationController mit einem UIViewController als rootController haben Dieses UIViewController hat ein Push wie folgt aus:

Als nächstes führt der gestoßene UIViewController einen NSAsynchronousFetchR aus equest wie folgt aus:

- (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); 
     } 
    }]; 
} 

Der EXC_BAD_ACCESS Absturz geschieht nur, wenn die Ergebnisse der fetchedItems var Einstellung scheint es. Wenn ich diese Zeile entferne, passiert das nicht, also vermute ich, dass da etwas dran sein muss. Ich habe mit "Enable Zombie Objects" getestet, wenn ich dies aktiviere stürzt die App nicht ab und gibt mir auch keine zusätzlichen Informationen.

Jede Hilfe würde sehr geschätzt werden!

+1

Es ist ein gutes Beispiel dafür am folgenden [link] (https://www.bignerdranch.com/blog/new-in-core-data-and-iOS-8-asynchronous-fetching/). Wenn Sie es betrachten, kann es etwas mit der Verwendung von GCD (d. H. Dem Dispatch async-Aufruf) zu tun haben, anstatt NSPersistentStoreAsynchronousFetchResultCompletionBlock für den Komplettierungsblock wie im Beispiel zu verwenden. – dean

+0

Ich habe das versucht und es schien keinen Unterschied zu machen. Der Artikel war in der Tat hilfreich und führte mich zu einer (bisher) funktionierenden Lösung. Vielen Dank! – Tonnie

Antwort

0

Der Link von deanwares Kommentar führte mich irgendwie zu einer Lösung. Zumindest scheint es jetzt soweit zu funktionieren. Ich muss zugeben, Core-Daten und Multithreading sind immer noch eine große Herausforderung für mich mit viel Versuch/Irrtum. Das folgende löste mein Problem und ich hoffe, eines Tages völlig zu verstehen warum.

I ersetzt:

_managedObjectContext = [RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext; 

von:

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

(Ich verwende RestKit, übrigens)