SCNetworkReachabilityGetFlags()は、あなたが説明した特定の状況下で返される時間が長い(例えば、WiFi経由のリモートホストの到達可能性を確認するなど)ために、インターネットのないルータへの接続)。いくつかのオプション:
オプション1.残りのアプリケーションを実行し続けることができるように、別のスレッドで呼び出します。
// Modified version of existing "updateStatus" method
- (void)updateStatus
{
// Query the SystemConfiguration framework for the state of the device's network connections.
//self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
self.remoteHostStatus = -1;
self.internetConnectionStatus = [[Reachability sharedReachability] internetConnectionStatus];
self.localWiFiConnectionStatus = [[Reachability sharedReachability] localWiFiConnectionStatus];
[tableView reloadData];
// Check remote host status in a separate thread so that the UI won't hang
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSTimer *timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(updateRemoteHostStatus) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[pool release];
}
// New method
- (void) updateRemoteHostStatus
{
self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
[tableView reloadData];
}
OPTION 2.リモートホストに接続しようとすると、タイムアウト値を使用して異なるAPI /関数を使用します。たとえば、次のようにReachabilityAppDelegate.mを変更します。そうすることで、あなたのアプリは放棄される前にX秒間しかハングしません。
注意すべきいくつかの他の事:
- について、あなたは求めているSCNetworkReachabilityGetFlagsに固有の呼び出しは()(Reachability.mではすなわち、ライン〜399)www.apple.comかどうかを確認しようとしています「外部インターネット」が一般的に「到達可能」であるかどうかを推測するために「到達可能」である。
- アップルのシステム構成フレームワークでは、「到達可能」とは、あなたが考えるものを意味するものではありません。公式の文書によると、「到達可能」とは理論上、コンピュータがホストXに接続できるが、実際に接続を最初に確立する必要がある(例えば、モデムを最初にダイヤルする)ことを意味するようだ。つまり、SCNetworkReachabilityGetFlags()は実際に接続を確立しません。
ありがとうございました。タイムアウト時間が経過するとコールバックに戻るようにタイムアウトを作成するにはどうすればよいですか?タイムアウト間隔の前にUIWebViewDelegate :: webViewDidFinishLoadが呼び出された場合、タイムアウトをキャンセルできます。 – 4thSpace
NSTimerのscheduledTimerWithTimeInterval:メソッドを見てください。たとえば、5秒後に何らかの方法を実行するタイマーを現在のスレッドに作成することができます。このメソッドは、SCNetworkReachabilityGetFlags()が終了したかどうかを確認し、終了していない場合は、タイムアウトロジックを実行します。 –