sendAsynchronousRequest mit tableView reloadData Verzögerung auf ziehen
Ich versuche, die neue sendAsynchronousRequest Hinzugefügt in iOS5.
Ich habe eine Modell-Klasse (Datei), eine Methode, die Anfrage, einige Daten von einem server, und dann gehen diese Daten an die controller-Klasse (FilesController), die das Modell erstellt wurde-Objekt.
Die model-Klasse hat eine Methode mit dem folgenden code:
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray *files = [self _dictionariesToFiles:decodedResponse];
handler(files);
}];
Die controller-Klasse, verwendet es wie folgt:
[File findAll:conditions completionHandler:^(NSArray *files) {
dataSource = files;
NSLog(@"set");
[self.tableView reloadData];
NSLog(@"reload");
activityIndicator.hidden = TRUE;
}];
In der Konsole kann ich anzeigen sofort, wie sich der NSLogs zeigt die "set" - und "reload" - Nachrichten, aber die Tabelle und die Anzeige ändert sich nicht, bis einige Sekunden (5-10s) bestanden haben.
Jemand weiß, wo ist das problem?
Dank.
PD: ich habe die async-request mit einem kompatiblen synchronisiert, und dann das problem verschwinden, aber will ein async-request für diese.
Dies ist das kompatible sync-code:
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
NSArray *files = [self _dictionariesToFiles:decodedResponse];
handler(files);
Du musst angemeldet sein, um einen Kommentar abzugeben.
müssen Sie tun
[tableView reloadData]
auf dem Haupt-thread. Alle UI-Operationen müssen durchgeführt werden auf dem Haupt-thread. Mehrere Möglichkeiten, dies zu tun. Die eine ist:EDIT: Hinzugefügt activityIndicator zum Beispiel
Ich habe mehrere Probleme mit:
[[NSOperationQueue alloc] init]
aber mit[NSOperationQueue mainQueue]
alles perfekt ist. Mit einer neuen Warteschlange für die Ausführung der Linie nicht folgt, der natürlichen Sequenz[NSOperationQueue mainQueue]
wird es auf der main-thread, die Niederlagen der Zweck der Verwendung einer asynchronen Anfrage in den ersten Platz....?