テーブルビューにつながるウェルカムスクリーンがあります。ユーザーが行をタップすると、プッシュ セグエを介して詳細ビューに移動します。これはすぐに読み込まれます。別のテーブル ビューへの別のプッシュ セグエも可能ですが、これは読み込みが遅くなります。これは、ロードする必要がある検索バーとデータが含まれているためだと思います。セグエを待つのではなく、プログラムのロード時にこのテーブル ビューをインスタンス化する方法はありますか? 読み込みが遅いテーブル ビューのクラスは と呼ばれBSGlossaryController
ます。の線に沿って何かを考えていましmyGlossaryController = [[BSGlossaryController alloc]init]
たが、よくわかりません。
2 に答える
通常、一度に 1 つの巨大なデータ チャンクをロードすることは望ましくありません。チャンクが大きくてビューの読み込みが大幅に遅くなる場合は、アプローチを再考する必要があります。メモリの問題は別として、一度に大量のデータを読み込むと、読み込み中にアプリの UI がブロックされます。これにより、アプリが応答しなくなり、ユーザーは何が起こっているのか不思議に思うでしょう。
大規模なデータ セットの読み込みは、いくつかの異なる方法で処理できます。優先順に示します。
- を使用し
NSFetchedResultsController
てデータをロードします。これにより、データのキャッシュとチャンクが自動的に処理されるため、応答性とパフォーマンスが維持されます。 - データを小さなサブセットに分割します。画面に一度に表示できるデータは限られているため、現在表示されていないデータをメモリにロードしても意味がありません。ビューの必要に応じて新しいデータを取り込みます。
- 最初に (データなしで) ビューを表示し、データの読み込みが行われていることをユーザーに通知するメッセージと共にアクティビティ インジケーターを表示し、次にバックグラウンド スレッドでデータを非同期に取り込みます。このアプローチでは、少なくとも、ユーザーが何が起こっているのか疑問に思うことはありません。
いくつかのコードを投稿して、何をしようとしているのか、その理由についてより良いアイデアが得られたら、より具体的な回答を提供できます。
起動時に BSGlossaryController をインスタンス化する場合は、セグエを削除し、起動時にインスタンス化し、手動でプッシュする必要があります。ただし、 alloc init を使用してインスタンス化することは望ましくありません。これにより、ストーリーボードのものとは異なるものが作成されます。UIStoryboard メソッドの instantiateViewControllerWithIdentifier: を使用してインスタンス化します (IB で識別子を指定するようにしてください)。プッシュするときが来たら、プッシュを行うために pushViewController:animated: を使用するメソッドにボタン (またはプッシュをトリガーするために使用しているもの) をフックする必要があります。
起動時に (アプリ デリゲートで) これを行う場合、新しく作成された BSGlossaryController をプロパティに割り当て、プッシュ元のコントローラーでアクセスする必要があります。そのコントローラー(プッシュ元のコントローラー)が画面に表示されるまでインスタンス化を待つことができる場合は、そのコントローラーのviewDidLoadメソッドで作成できます。