1

tableview1.row から、大量の行がフェッチされている tableview2 に移動しています。ロード時間が約 3 秒であることを考えると、tableview1.row が選択されるとすぐにナビゲーションが tableview2 にスライドし、データがフェッチされて基になるテーブル ビューにレンダリングされる間、tableview2 の上に UIActivityIndi​​catorView を表示する必要があります。tableview2 は実際には親 UIView のサブビューであることに注意してください (親が UITableView であるのとは対照的です)。

この投稿を見ました: UITableView1 から UITableView2 に移動するときに、アクティビティ インジケーターを表示する必要があります。

... これは、データ フェッチに関するアクティビティ インジケーターの start および stopAnimating 呼び出しを tableview2 の viewDidLoad に追加するように指示します。

つまり、tableview2が目に見えてスライドする前にviewDidLoadが実行されて完了すると、上記のソリューションがどのように機能するかわかりません。

これとは別に、IB の tableview2 にアクティビティ インジケーターを追加してみました。また、IBOutlet インジケーターの開始/停止アニメーション コードを viewDidAppear に追加しました。何が起こるかというと、データ フェッチが実行され、インジケーターが回転していることがわかりますが、フェッチの最後にテーブル ビューが空になります。cellForRowAtIndexPathなどがすでに起動しているため、viewDidAppearが遅すぎてテーブルビューにデータを追加できないようです。

誰でもポインタを提案できますか? ここで明らかな何かを見落としている可能性が非常に高いです (私がいる場所は午前 5 時近くで、脳がドロドロしていると思います)。viewDidAppear から cellForRowAtIndexPath などを再トリガーする必要がありますか? テーブル ビューが親ビューではなくサブビューであるという問題はありますか?

ありがとう

4

1 に答える 1

1

私は自分の質問をもう一度見てみましたが、答えは実際にはかなり簡単です。通常、非常に集中的な処理はメイン スレッドで実行しないでください。同じスレッドでアクティビティ インジケーターのデータ集約型フェッチと UI 表示を実行しようとしていたため、これらは順番に処理されていました。

解決策は、新しいビュー コントローラーに入り、a) メイン スレッドでアクティビティ インジケーター アニメーションを開始し、b) 別のスレッドでデータ集約型フェッチを実行することです (performSelectorInBackground を使用)。UI 関連の更新は、バックグラウンド スレッドからは適用できません。これらはメインスレッドに戻されるべきです。

すでにこれに関する多くのSO投稿があります(例はこちら)、最初からこれらを取り上げなかったのは私の悪いことです:)

于 2010-05-03T13:15:26.897 に答える