2010-12-27 6 views
0

私のiPhoneアプリでオンラインデータを処理しようとしています。しかし、私はこのために怒っている:UITableViewリロードデータがすぐにリロードされない

私はNSURLConnectionでデータをダウンロードするオブジェクトを持っています。別のスレッドで接続(と他のもの)を使って作業を開始するメソッド - [ NSThread detachNewThreadSelector:@selector(doConnectionInNewThread) toTarget: self withObject: nil ];

データがロードされると(connectionDidFinishLoading)、それらを私のviewControllerに渡します。このすべてのものはうまく動作します。私がブレークポイントやNSLogを使用すると、私はデータをUITableViewで表示する準備ができています。 reloadDataを呼び出すと、すぐに何も起こりません。おそらく2秒後にデータをリロードします(この遅延後に- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathが呼び出されます)。

ただし、tableViewをスライドすると、データがすぐに再読み込みされます。接続などはうまくいきますが、データをリロードしないだけです。どうして? URLConnectionによってmainThreadがブロックされている可能性があると私は考えました。しかし、今は別のスレッドで使用していますが、それはまだ同じです...

答えて

2

分離されたスレッドでテーブルビューにアクセスしていますか?

使用して、メインスレッド上でUIを更新するようにしてください:

-performSelectorOnMainThread:withObject:waitUntilDone:

+0

HM。だから、私はオブジェクトを(通常は(分離されていないスレッドで)接続のものを実行するが、私はすべての必要なデータを取得するときに " - performSelectorOnMainThread:withObject:waitUntilDone:"私のviewController reloadDataに知らせるために、 ありがとうございます! このトリックは何ですか?名前は、 "忍耐をもってmainThreadでこれを行う"のようなものです。それで、以前のURLConnectionが停止します。 – D33

+0

非メインスレッド上のUI状態マシンへのアクセスは、一般的にはサポートされていません。特に、reloadDataは、データをリロードするために必要な表示としてテーブルビューをマークします(つまり、リロードデータは遅延です)。あなたはメインスレッドではないので、表示スケジューリングは間違っている可能性があります。 – Julien

+0

少なくとも適切なロックがない場合でも、バックグラウンドスレッドからのデータを表示するときに使用する同じコレクション(可変配列または辞書)を操作してはいけません。あるスレッドからNSMutableArrayまたはNSMutableDictionaryにオブジェクトを追加している間に別のスレッドにオブジェクトを追加することはできません。 –

関連する問題