2

Ich habe eine Kerndatenanforderung, die über einen NSFetchedResultsController ausgeführt wird. Das erwartete Ergebnis dieses Codes ist, dass eine UIActivityIndicator wird startAnimating der Aufruf erfolgt, abgeschlossen werden, und dann die Tabelle zurückgeben, bevor der Indikator `stopAnimating.UIActivityIndicator beendet das Animieren, bevor NSFetchedResultsController den Abruf beendet

Was tatsächlich passiert ist, dass die Funktion zurückkehrt, bevor der NSFetchedResultsController alle Informationen erhält und/oder die TableView neu auffüllt. stopAnimating wird fast sofort aufgerufen, und erst später lädt die Tabelle.

ist mein Code wie folgt:

[_loadingActivityIndicator startAnimating]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"user"]; 
[fetchRequest setReturnsObjectsAsFaults:NO]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"connection.userId matches %@", [NSString stringWithFormat:@"%@",currentUser.userId ]]; 
fetchRequest.predicate = predicate; 

fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"firstname" ascending:YES]]; 

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.coreDataStack.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

self.fetchedResultsController.delegate = self; 

// Perform Fetch 
NSError *error = nil; 
[self.fetchedResultsController performFetch:&error]; 

if (error) { 
    NSLog(@"Unable to perform fetch."); 
    NSLog(@"%@, %@", error, error.localizedDescription); 
} 

[_loadingActivityIndicator stopAnimating]; 

Was mache ich falsch?

+0

Verarbeitet die Tabellenansichts-Neuladeverarbeitung irgendetwas Asynchrones? Konzeptuell möchten Sie lediglich sicherstellen, dass Sie 'stopAnimating' ungefähr zur selben Zeit aufrufen, zu der Sie' reloadData' auf dem Tisch aufrufen, und das geschieht scheinbar zu unterschiedlichen Zeiten. Oder das andere Problem, das dieses seltsame Verhalten verursachen kann, ist, wenn Sie versehentlich einige UI-Updates in einer anderen Warteschlange als der Hauptwarteschlange vorgenommen haben. – Rob

+0

Ich kenne keine Kerndaten, aber ich würde vermuten, dass Sie den stopAnimating in den Delegaten verschieben müssen, den Sie für den fetchedResultsController festgelegt haben, wenn der Abschlussvorgang/die Ergebnisse der Abrufoperation über diesen Delegaten angezeigt werden. – Gruntcakes

+0

@DonaldTrumpatemyhamster yow hatte Recht, Wenn du das zu einer Antwort machst, akzeptiere ich es – DCIndieDev

Antwort

1

Sie legen einen Delegaten fest, der aufgerufen wird, wenn die Abrufergebnisse beendet sind. Sie müssen den stopAnimating-Aufruf an diesen Delegaten verschieben.

Verwandte Themen