1

今まで、一度だけ起こった。

私はサードパーティのライブラリを使用しており、以下の関数を呼び出しています。

- (BOOL) isReachableViaWiFi {

    NSAssert(reachabilityRef, @"isReachableViaWiFi called with NULL reachabilityRef");

    SCNetworkReachabilityFlags flags = 0;
    NetworkStatus status = NotReachable;

    if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) {
        status = [self networkStatusForFlags: flags];
        return  (ReachableViaWiFi == status);
    }

    return NO;

} // isReachableViaWiFi

UI が停止していることがわかったら、プログラムの実行を一時停止し、次の行で停止するたびにSCNetworkReachabilityGetFlags:

ここに画像の説明を入力

ここに画像の説明を入力

私はそれについて混乱しています。ヒントをありがとう。

4

2 に答える 2

3

あなたが投稿したコードに基づいて、あなたの問題は、メインスレッドで SCNetworkReachabilityGetFlags を同期的に呼び出すことだと思います。この関数がインターネット上の何かに ping を送信する可能性は非常に高いと思います。ping を試行するリモート ホストが何らかの理由で到達できない場合 (インターネット接続が失われた場合)、通常のネットワーク タイムアウトが発生しますが、これは非常に長くなる可能性があります (30 秒)。今回はメイン スレッド (すべての UI を含む) をブロックします。

したがって、問題の解決策は、別のキュー/スレッドでこの関数を呼び出してから、結果をメインスレッドに渡すことです。これを行うことで、リモート ホストの応答を待っている間、メイン スレッドをブロックしなくなります。

一般に、メイン スレッドでネットワーク インタラクション コードを実行することは避けてください。

于 2013-07-15T08:02:07.367 に答える
1

Reachability サンプルは、SCNetworkReachability API の非同期使用を示しています。API を同期的に使用できますが、メイン スレッドで hostName による同期チェックを発行しないでください。デバイスが DNS サーバーに到達できない場合、または低速ネットワーク上にある場合、SCNetworkReachabilityGetFlags 関数への同期呼び出しは、ホスト名の解決を試みるために最大 30 秒間ブロックされる可能性があります。これがメイン スレッドで発生した場合、アプリケーション ウォッチドッグは、非アクティブ状態が 20 秒続くとアプリケーションを強制終了します。

于 2014-11-27T07:44:46.383 に答える