2

私のアプリのメイン ビューは、UIImagePickerController カメラ ビューです。アプリが (didBecomeActive で) アクティブになると、ネットワーク リクエストから生成されたいくつかの設定を表示するモーダル ビュー コントローラーを提示します。(デバッグの目的で、ネットワーク リクエストを取り出し、現在ダミー ビューを表示しているだけであることに注意してください)

モーダル ビューはスムーズにアニメーション化されますが、読み込み後に 3 秒間フリーズした後、通常どおり応答します。ビューを閉じた後 (スムーズにアニメーション化されます)、イメージ ピッカー コントローラーが 2 秒間一時停止してから、通常どおり再開します。

メインスレッドを詰まらせる操作がないことを確認するために、モーダル ビュー コントローラーからすべての機能を削除しました。最も基本的なコントローラーを紹介していますが、それでも UI が不安定です。これは、viewDidLoad/Unload などを呼び出している現在のビュー コントローラーからのものであると思われますが、検索では、モーダル ビューが表示されているときに、現在のビュー コントローラーでどのデリゲート メソッドが呼び出されるかについての情報が得られませんでした。

私の問題は、次のように答えることで解決できます。

  • モーダル ビューが表示されているときにプレゼンターで呼び出されるデリゲート メソッドは何ですか?
  • (もしあれば^)どうすればそれらのメソッドを呼び出さないようにしたり、よりスムーズに実行したりできますか?
  • モーダル ビュー コントローラーに関連する一般的な落とし穴は何ですか?
4

3 に答える 3

2

これはおそらく、メイン スレッドで多くの処理を行っているためです (通常、UI が停止すると、メイン スレッドの処理が原因です)。いくつかのコードを提供してください。具体的には、最も重い処理コードだと思われるコードを提供してください! 下手な英語でごめんなさい:P! 最も重いコードを別のスレッドにディスパッチしてみてください

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //your heavy code here =)
});

よろしく、ルーカス

于 2013-06-03T20:14:53.323 に答える
0

わずかな遅延の原因となる可能性があることの 1 つは、同じ viewController を毎回ゼロから再ロードすることです。

BProfileTableViewController * _profileViewController = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:profileViewController];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

これが tableView クリックにある場合、アプリが viewController を再度作成する必要があるたびに、ここで確認できます。代わりに、ビューを再利用するだけで、そのラグの一部が取り除かれます。

これをヘッダーファイルに追加します

BProfileTableViewController * _profileView;

次に、モーダル ビューのロード コードが次のように変更されます。

// Open the users profile
if (!_profileView) {
    _profileView = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
}

UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:_profileView];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

これは、ビューを再作成するのではなく、単にビューをリロードしていることを意味します

于 2015-06-05T11:16:36.153 に答える