6

Reachability クラスを使用して、インターネット接続が利用可能かどうかを確認します。問題は、Wi-Fi は利用できるがインターネットが利用できない場合、この- (NetworkStatus) currentReachabilityStatus方法には時間がかかりすぎることです。

私のコード:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

アプリケーションは 2 行目で一時的に「フリーズ」します。この待機の最大時間を定義する方法は?

4

2 に答える 2

3

私はそうは思わない。しかし、もっと重要なことは、可能であればあなたが望んでいないと思います(誤検知が発生する可能性があります)。到達可能性を実行させてください。

Reachabilityデモプロジェクトを見ると、インターネットが必要なときに呼び出しreachabilityWithHostNameて確認するという概念ではありません。currentReachabilityStatusアプリデリゲートのdidFinishLaunchingWithOptions中にcurrentReachabilityStatusを呼び出し、通知を設定すると、インターネット接続が変更されたときにReachabilityが通知します。currentReachabilityStatus(a)起動時に到達可能性を設定すると、後続のチェックは(接続に関係なく)十分に高速であることがわかります。ただし、(b)ジャストインタイムの方法で接続を確認します。

そして、どうしてもすぐに処理を開始する必要がある場合、問題はそれをバックグラウンドにプッシュできるかどうかです(例dispatch_async())。たとえば、私のアプリはサーバーから更新を取得しますが、それはバックグラウンドで行われているため、私もユーザーも遅延を認識していません。

于 2012-04-11T15:31:30.567 に答える
0

私は同じことで問題を抱えていましたが、タイムアウトを指定する方法を見つけました。Apple の到達可能性クラス内でこのメソッドを置き換えました。

- (NetworkStatus)currentReachabilityStatus
{
NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL     SCNetworkReachabilityRef");
//NetworkStatus returnValue = NotReachable;
__block SCNetworkReachabilityFlags flags;

__block BOOL timeOut = NO;
double delayInSeconds = 5.0;

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){

    timeOut = YES;

});

__block NetworkStatus returnValue = NotReachable;

__block BOOL returned = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
    {
        if (_alwaysReturnLocalWiFiStatus)
        {
            returnValue = [self localWiFiStatusForFlags:flags];
        }
        else
        {
            returnValue = [self networkStatusForFlags:flags];
        }
    }
    returned = YES;

});

while (!returned && !timeOut) {
    if (!timeOut && !returned){
        [NSThread sleepForTimeInterval:.02];
    } else {
        break;
    }
}

return returnValue;
}
于 2015-01-14T18:57:27.073 に答える