0

問題がどこにあるかを確認するためにコードにブレークポイントを配置したところ、cellForRowAtIndexPath メソッドでセルをロードしているときに、特に適切な配列 (followeesPhotoURLs) から写真を取得しているときに、プログラムがクラッシュすることがわかりました。これは、配列が空であるためです。メイン スレッドは、インターネットからのダウンロード専用のスレッドの実行が終了する前にセルの読み込みメソッドを実行することを決定するため、写真はダウンロードされませんでした (実行が開始されます)。

コースのオーディターズ ディスカッション グループ ページを調べたところ、他の誰かが同じ問題を抱えていることがわかりましたが、スレッドでは問題が解決されず、メールを送信しても役に立ちませんでした: http://groups.google.com/group/iphone- appdev-auditors/browse_thread/thread/ccfc6ae99b4cf45d/ef1b8935e749c7c2?hl=ja&lnk=gst&q=presence3#ef1b8935e749c7c2

4

2 に答える 2

1

私の UITableView の最初のルールは、準備ができていないセクションまたは行 (プレースホルダーのみであっても) をレポートすることではありません。これは、毎回クラッシュするためです。

リソースのロード中にスピナーが回転しています。したがって、バックグラウンド プロセスの正確な状態がわからないため、準備ができているかどうかわからないリソースを待機しています。準備ができていないことを示す値をメインスレッドに設定するのはどうですか。次に、セカンダリ スレッドが読み込みを終了したら、 performSelectorOnMainThread を実行して、メイン スレッド関数に値を設定させ、続行できることを示すことができます。値が続行を示すまで、メイン スレッドは、セカンダリ スレッドが触れている可能性のある値にアクセスしようとしません。データの準備ができるまでセルに「読み込み中」などの表示が表示されるか、準備ができたらセルを追加するだけです。

もう1つ-UIに触れることができるのはメインスレッドのみです。明示的に記述されていない限り、UIKit にはスレッドセーフなものはありません。プログレス インジケータへの変更は、メイン スレッドで処理する必要があります。メイン スレッドは、インジケータを開始して停止する必要があります (おそらく、上記のように、セカンダリ スレッドが「完了」を通知したとき)。

于 2009-10-26T21:47:05.320 に答える
0

私は今日この作業を終えたところです。私が観察した一連のイベントは次のとおりです。

  1. 配列には何も含まれていないため、テーブルビューは何も読み込まれません
  2. あなたのスレッドが行き、Twitter データを取得します
  3. テーブル ビューが Twitter データ [self.tableView reloadData] で更新されます。

あなたが私のような人なら、次のようなものを使用してユーザー名を設定しようとします

cell.textLabel.text = [[userInfo objectAtIndex:indexPath.row] valueForKey:@"name"];

非常に具体的であるため、アプリケーションは実際にそれを探して、何も見つからない場合でも null を返さないと思います。例のコードとは異なります。

cell.text = [photoNames objectAtIndex:indexPath.row];

...そのため、空の配列を含むデータを初めてロードしようとすると、アプリケーションでエラーが発生します。

これを回避する方法は、最初にプロパティ リストからユーザー名をロードする配列を作成して、コンテンツの配列にいくつのエントリが必要かを把握することです。重要な部分は、セルを設定する前に条件を作成して、次のような必要な情報がすべて揃っていることを確認することです...

    // Set up the cell...
if ([userInfo count] == [userList count]) {

userInfo は、Twitter から取得したデータを含む辞書の配列です。

userList は、プロパティ リストからの値の配列です。

于 2010-02-03T07:25:15.337 に答える