我有一个 tableviewcontroller,它的 tableviewcells 直接连接到另一个 tableviewcontroller。segue 是从 tableViewCell 原型创建到情节提要中的“子”tableview。我在父表视图中使用prepareForSegue,如下所示。当如下线程化时,在执行新的子表视图的方法(例如 cellForRowAtIndexPath、numberOfRowsInSection、viewDidLoad)后,将“放回”主线程中的代码(因为它与 UI 相关)被执行。结果是子tableView 没有建立(例如numberRows=0)。
我通过在新视图的设置器(setPhotoList、setPhotoListTitle)中执行 taleView reloadData 来“修复”这个问题。有没有更好的方法来同步/序列化跨 segue 的主线程?我的修复似乎有点低效,因为子表视图被绘制但如果两个设置器(在这种情况下)都重新加载,则必须重新加载一次甚至两次。谢谢。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UITableViewCell *cell = sender;
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge];
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr downloader", NULL);
dispatch_async(downloadQueue, ^{
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
NSDictionary *place = [self.places objectAtIndex:indexPath.row];
NSArray *photosHere = [FlickrFetcher photosInPlace:place maxResults:MAX_NUM_PHOTOS];
NSString *placeAll = [place objectForKey:FLICKR_PLACE_NAME];
NSArray *placeComponents = [placeAll componentsSeparatedByString:@","];
dispatch_async(dispatch_get_main_queue(), ^{
if ([segue.identifier isEqualToString:@"Show Photos At Place"]) {
[segue.destinationViewController setPhotoList:photosHere];
[segue.destinationViewController setPhotoListTitle:[placeComponents objectAtIndex:0]];
}
});
});
dispatch_release(downloadQueue);
}