2

バックグラウンドでデータを取得してからUITableViewを更新するUITableViewControllerがあります。ただし、更新メソッドをバックグラウンドで実行すると、アプリ全体のすべての遷移アニメーションが中断されます (View Controller をナビゲーション スタックにプッシュするときのスライド)。奇妙なことに、まったく同じモデルが、これと非常によく似た他のクラスで機能します。バックグラウンド更新に使用している呼び出しは次のとおりです。

[self performSelectorInBackground:@selector(updateData) withObject:nil];

ただし、これは機能しますが、もちろんバックグラウンドでは実行されません。

[self updateData];

そして最後に実行されるメソッド:

- (void)updateData{
    updating = YES;
    [progress show:YES];
    dataSource = [[NetworkHandler sharedInstance:self] getRaces];
    [progress hide:YES];
    updating = NO;
    [self.tableView reloadData];
}

更新フラグは決してセマフォを試みるものではなく、ユーザーがビュー間を行ったり来たりした場合にビューが 2 回更新されないようにする方法にすぎません。;)

4

2 に答える 2

5

[self.tableView reloadData];ある種のスレッドの問題を引き起こす可能性があるようです。UI のすべての更新は、メイン スレッドで行う必要があります。したがって、これは機能するはずです:

[self.tableView performSelectorOnMainThread:@selector(reloadData)];

于 2012-05-31T09:58:42.900 に答える
1

2015 年 2 月の時点で、上記の回答に記載されている方法は廃止され、次の方法に置き換えられました。

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
于 2015-02-11T14:25:47.517 に答える