0

テーブルビューセルが別のテーブルビューコントローラーに直接つながるテーブルビューコントローラーがあります。セグエは、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);

}

4

1 に答える 1

0

どうですか...

  1. 子ビュー コントローラーのセッターで、フラグを設定します。子View Controllerがデータをリロードする必要があるかどうかを示します。
  2. 子ビュー コントローラのviewWillAppearまたはで、フラグに応じてviewDidAppearを使用してデータをリロードします。downloadQueue
于 2012-04-23T17:54:28.313 に答える