0

我有一个 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);

}

4

1 回答 1

0

怎么样...

  1. 在子视图控制器的设置器中,设置一个标志。它指示子视图控制器是否应该重新加载数据。
  2. 在子视图控制器的viewWillAppearor中,根据标志viewDidAppear使用 重新加载数据。downloadQueue
于 2012-04-23T17:54:28.313 回答