0

テーブル ビューがあり、ユーザーが行を選択すると、それらを新しい ViewController にプッシュします。最初に、ViewDidLoad メソッドですべてのビュー オブジェクトを初期化しました (Web サービス呼び出しを含む) が、テーブルビューから新しいビュー コントローラーへの移行に非常に長い時間がかかることがわかりました。

代わりに、UI の初期化の大部分を ViewDidAppear メソッドに移動しました。これにより、テーブルビューから新しいビュー コントローラーへの移行が高速化されたことが気に入っています。

ただし、ViewDidAppear メソッドが完了して UI が読み込まれるまで、画面の上部にある NavigationBar のボタン (戻るボタンなど) を押すことはできません。

これに対する解決策は何ですか?ユーザーが NavigationBar のボタンを操作するのを妨げずに UI をロードする別の方法はありますか?

ありがとう!!

4

3 に答える 3

0

グランド セントラル ディスパッチを使用して、Web サービス呼び出しを非同期に行うことができます。これにより、メイン スレッドの UI の応答性が維持されます。

//create new queue
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.siteName.projectName.bgqueue", NULL);

//run requests in background on new queue
dispatch_async(backgroundQueue, ^{
    //insert web service requests here
});

より詳細なチュートリアルは次のとおりです。

http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

于 2014-06-02T15:55:49.030 に答える
0

メインスレッドでやりすぎ。IO や長い計算などの長時間の操作をオフロードしますが、バックグラウンド スレッドで UI を台無しにしないように注意してください。

メイン スレッドでのみ UI に触れます。(安全に見えることもありますが、長期的には常に奇妙な問題が発生することに注意してください)

簡単な方法の 1 つは、GCD を使用することです。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
    //insert web service requests / computations / IO here 

    dispatch_async(dispatch_get_main_queue(),^{
        //back to the main thread for UI Work
    });
});
于 2014-06-02T16:05:20.327 に答える
-2

次の方法を使用して、バックグラウンドで UI を初期化してみてください

[self performSelectorInBackground:@selector(initYourUI) withObject:yourObj];

これは、ViewDidLoad

于 2012-07-12T05:28:15.260 に答える