2つのUITableViewControllerがあり、ストーリーボードを使用してそれらの間をセグエしています。
ではprepareForSegue:sender:
、最初のVCがWebサービスからNSArrayを取得し、ダウンロードされたデータを使用して宛先VCのモデルを設定します。ダウンロード部分をに入れて、dispatch_queue_t
非同期で実行され、UIスレッドをブロックしないようにします。テーブルセルをタップし、UIActivityIndicatorViewの回転を開始して写真をダウンロードし、写真がダウンロードされたら、スピナーを停止してセグエを続行します。
最初のUITableViewControllerには、次のprepareForSegue:sender:
メソッドがあります。
- (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]];
}
}
現在、スピナーを表示したり、ダウンロードが完了するのを待たずに、すぐにセグエを実行しています。
メインスレッドをブロックせずに、またすぐにセグエせずに、データを非同期にダウンロードして宛先ビューを準備するにはどうすればよいですか?