テーブルビューセルが別のテーブルビューコントローラーに直接つながるテーブルビューコントローラーがあります。セグエは、tableViewCell プロトタイプからストーリーボードの「子」テーブルビューに作成されました。以下のように、親テーブルビューで prepareForSegue を使用しています。以下のようにスレッド化すると、新しい子テーブルビューのメソッド (cellForRowAtIndexPath、numberOfRowsInSection、viewDidLoadなど) が実行された後に、 (UI 関連であるため) メイン スレッドに「戻される」コードが実行されます。その結果、子の tableView が構築されませんでした (例: numberRows=0)。
新しいビューのセッター (setPhotoList、setPhotoListTitle) 内で taleView reloadData を実行することで、これを「修正」しました。代わりにセグエ全体でメインスレッドを同期/シリアル化するより良い方法はありますか? 子テーブルビューが描画されますが、両方のセッター (この場合) がリロードを行う場合は、1 回または 2 回リロードする必要があるため、私の修正は少し非効率的です。ありがとう。
- (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);
}