0

私には一見単純な問題があり、一生解決できないようです。私の iOS アプリには、UICollectionViewタップするとネットワーク操作をトリガーする があり、完了するまでに数秒かかることがあります。情報がダウンロードされている間、ロードが完了するまで正方形に座っているUIViewa でセルを埋めるa を表示し、セグエがトリガーされます。UIActivityIndicatorView問題は、それが表示されないことです。今私のコードは次のようになります:

myLoadView.hidden = NO;
//Network Operation
myLoadView.hidden = YES;

アプリは数秒間停止し、次のビューに移動します。Grand Central Dispatch がソリューションに関係していると思いますが、このコードは で行われprepareForSegue、ネットワーク情報を次のビューに渡す必要があることに注意してください。このため、シーンを切り替える前にダウンロードを終了しないと、明らかな問題が発生します。どんな助けでも大歓迎です。ありがとう!

4

4 に答える 4

2

iOS は、ルーチンを実行した後、インターフェイスの変更をコミットします。したがって、ネットワーク操作をバックグラウンド スレッドで実行してから、メインに戻って「show my view now thing」を実行する必要があります。以下のコードを参照してください。

myLoadView.hidden = NO;
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    //Network Operation
    dispatch_async(dispatch_get_main_queue(), ^{
        myLoadView.hidden = YES;
    });
});
于 2013-06-10T06:23:39.137 に答える
0

あなたのネットワーク操作は、メイン スレッド、別名 UI スレッドで実行されているようです。これにより、ビューを再表示する呼び出しを含む、それ以降のすべての UI 呼び出しが完了するまでブロックされます。

これを解決するには、呼び出しを非同期にします。

まだ読んでいない場合は、これをすべて読む必要があります。

于 2013-06-10T06:47:41.923 に答える
0

他の回答で述べたように、問題は、ブロックしている現在のメソッドの実行が終了するまで UIView の変更が発生しないことです。GCD が利用可能になる前は、メソッドを 2 つに分割してperformSelector:withObject:afterDelay(UI ループでも 2 番目の部分を実行するために) またはperformSelectorInBackground:withObject:最初のメソッドの最後で使用していました。これにより、待機中のすべてのアニメーションが最初にコミットされ、次に 2 番目の方法で実際のタスクが実行されます。

于 2013-06-10T07:46:39.023 に答える
-1

このタイプの表示に適したオプションは、SVProgressHUDMBProgressHUDなどのカスタム HUD ライブラリを使用することです。

于 2013-06-10T06:13:39.940 に答える