我有两个 UITableViewControllers,我正在使用情节提要在它们之间进行切换。
在prepareForSegue:sender:
中,第一个 VC 从 Web 服务获取 NSArray,并使用下载的数据设置目标 VC 的模型。我将下载部分放入 a 中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]];
}
}
现在它正在立即执行 segue,而不显示微调器或等待下载完成。
如何在不阻塞主线程的情况下异步下载数据以准备目标视图,也无需立即进行 segue?