0

Web ホストが利用可能かどうかを確認したいので、以下のコードを使用しました。動作しますが、サイトの応答が遅いと待機し続けることがあります。タイムアウトを埋め込むにはどうすればよいですか? ホストから 2 ~ 3 秒以内に応答がない場合は、false も返します。私を助けてください

- (BOOL)isDataSourceAvailable {

    static BOOL checkNetwork = YES;
    static BOOL _isDataSourceAvailable = NO;
    if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
        checkNetwork = NO;
        Boolean success;
        const char *host_name = "google.com"; //HOST
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
        SCNetworkReachabilityFlags flags;
        success = SCNetworkReachabilityGetFlags(reachability, &flags);
        _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
    }
    return _isDataSourceAvailable;
}
4

2 に答える 2

1

とてもシンプルです

実装するだけNSTimer

[NSTimer scheduledTimerWithTimeInterval:2.0
    target:self
    selector:@selector(targetMethod:)
    userInfo:nil
    repeats:NO];

targetMethod: が呼び出された場合、そのタイムアウト。

ここで電話することを忘れないでください

[myTimer invalidate];
myTimer = nil;

サーバーから応答を受け取った場合。

これがお役に立てば幸いです。

于 2012-07-04T08:02:29.027 に答える
1

SCNetworkReachability*通話をブロック モードで使用しています。を使用してコールバックを設定SCNetworkReachabilitySetCallbackし、実行ループでスケジュールする必要がありますSCNetworkReachabilityScheduleWithRunLoop。詳細については、Apple の Reachability Exampleを参照してください。コールバックを使用する場合、NSTimer(ユーザー Prateek の説明と同様に) を使用して、現在の到達可能性タスクを中止できます。

関数/メソッド呼び出しを行ってすぐに答えを知る代わりに、関数/メソッド呼び出しを行い、到達可能性成功、到達可能性失敗、またはタイムアウトの 3 つのコールバックのいずれかを待機するため、コードを変更する必要があります。

于 2012-07-04T08:16:26.993 に答える