0

我想检查一个网络主机是否可用,所以我使用了下面的代码,它可以工作,但有时如果网站响应速度很慢,它会一直等待,我如何在其中植入超时?如果主机在 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 的可达性示例中找到更多信息。当您使用回调时,您可以使用NSTimer(类似于用户 Prateek 所描述的)来中止当前的可达性任务。

您将不得不修改您的代码,因为不是进行函数/方法调用并立即知道答案,而是您将进行函数/方法调用并等待三个回调之一:可达性成功、可达性失败或超时。

于 2012-07-04T08:16:26.993 回答