Wie zu warten, bis ein anderer thread zu vervollständigen, bevor Sie fortfahren mit einem segue?
Habe ich zwei UITableViewControllers und ich bin segueing zwischen Ihnen, mithilfe eines Storyboards.
In prepareForSegue:sender:
die ersten VC bekommt ein NSArray von einem web-service und setzt das Modell der Ziel-VC mit den heruntergeladenen Daten. Setze ich den Download-Teil in eine dispatch_queue_t
es wird also asynchron ausgeführt und nicht blockiert den UI thread. Ich will Tippen Sie auf eine Zelle in der Tabelle, haben die UIActivityIndicatorView drehen beginnen, laden Sie die Fotos, und wenn die Fotos heruntergeladen haben, beenden Sie den spinner und fahren Sie mit der segue.
In der ersten UITableViewController-ich habe eine prepareForSegue:sender:
Methode:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"SelectPlace"]) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[spinner startAnimating];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:spinner];
__block NSArray *photos = [[NSMutableArray alloc] init];
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr download", NULL);
dispatch_async(downloadQueue, ^{
photos = [FlickrFetcher photosInPlace:[self.places objectAtIndex:indexPath.row] maxResults:50];
});
dispatch_release(downloadQueue);
[spinner stopAnimating];
[segue.destinationViewController setPhotos:photos withTitle:[[sender textLabel] text]];
}
}
Recht, jetzt ist es sofort ausführen die segue, ohne sich mit dem spinner oder mit dem warten auf das herunterladen zu beenden.
Wie kann ich asynchron den download der Daten zur Vorbereitung der Ziel-anzeigen, ohne zu blockieren den Haupt-thread, aber auch ohne sofort segueing?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Ihr Ziel-view-controller die Daten laden. Wenn der Benutzer eine Zeile in der Tabelle, sollten Sie sofort den übergang auf die neue view-controller. Dies ist notwendig, um die Benutzeroberfläche bissig. In
prepareForSegue
, geben die Ziel-view-controller die Daten, die Sie brauchen, um den laden selbst. Dann in derviewWillAppear
im Ziel-view-controller, zum laden der Daten asynchron.Wenn Sie möchten, um die Ziel-view-controller Generika und vermeiden Sie Flackern Foto abrufen aus, um die Ziel-view-controller, können Sie ein Protokoll, das eine Methode hat wie
getThePhotoData
und haben einedataSource
Zeiger in Ihre Ziel-view-controller eingestellt istself
imprepareForSegue
. Dann, inviewWillAppear
im Ziel-view-controller, call[dataSource getThePhotoData]
asynchron. Die flicker Foto fetch erfolgt in dergetThePhotoData
Methode, die bereits in die Ansicht-controller, der der Auslöser für den übergang.prepareForSegue
? Ich war in der Hoffnung zu halten, die Ziel-view-controller Flickr-free so war es generische, da ich die Unterklasse, die es anderswo. Vielleicht ist nicht, dass große Sache.prepareForSegue
denn der Benutzer erwartet bei der Benutzeroberfläche, um den übergang sofort und nicht nach 5 Sekunden, die es dauert, das laden der Daten aus dem Netzwerk.In prepareForSegue Sie kann nicht aufhören, segue. Sie müssen eher nicht auslösen, segue, bis Sie alle Daten. Also ich schlage vor, Sie erstellen manuelle segue und nennen es, wenn Sie alle Daten heruntergeladen.
Beispielsweise die Kette der Ereignisse werden kann, ähnlich wie diese: