我有一个用Swift 1.2编写的函数,用于检查地址或IP的可达性。这里是 :
func isHostConnected(hostAddress : String) -> Bool { var response : NSURLResponse? let request = NSMutableURLRequest(URL: NSURL(string: hostAddress)!) request.timeoutInterval = 3 let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) return ((response as? NSHTTPURLResponse)!.statusCode == 200) }
现在,NSURLConnection根据Xcode的建议,我已经弃用了,我尝试使用编写它NSURLSession.dataTaskWithRequest,这里是:
NSURLConnection
NSURLSession.dataTaskWithRequest
func isHostConnected(hostAddress : String) -> Bool { let request = NSMutableURLRequest(URL: NSURL(string: hostAddress.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)!) request.timeoutInterval = 3 let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: NSOperationQueue.mainQueue()) var responseCode = -1 session.dataTaskWithRequest(request, completionHandler: {(data : NSData?, response : NSURLResponse?, error : NSError?) -> Void in responseCode = (response as? NSHTTPURLResponse)!.statusCode })!.resume() return (responseCode == 200) }
上面的代码始终返回 false (其明显),因为它是completionHandler在单独的Thread上执行的。
completionHandler
我担心的是,是否可以completionHandler()像sendSynchronousRequest通过阻止它那样在MainThread上运行它?
completionHandler()
sendSynchronousRequest
我有理由不在这里使用“苹果的可及性”。
任何建议都会有所帮助。:)
检查服务器上是否存在资源需要发送HTTP请求并接收响应。TCP通信可能会花费一些时间,例如,如果服务器繁忙,客户端和服务器之间的某些路由器无法正常工作,网络断开等。 这就是为什么总是首选异步请求的原因。即使您认为请求只需要几毫秒,由于某些网络问题,有时有时也可能只有几秒钟。而且-众所周知- 将主线程阻塞几秒钟是一个很大的禁忌。
检查服务器上是否存在资源需要发送HTTP请求并接收响应。TCP通信可能会花费一些时间,例如,如果服务器繁忙,客户端和服务器之间的某些路由器无法正常工作,网络断开等。
这就是为什么总是首选异步请求的原因。即使您认为请求只需要几毫秒,由于某些网络问题,有时有时也可能只有几秒钟。而且-众所周知- 将主线程阻塞几秒钟是一个很大的禁忌。
话虽如此,您可以使用“计数信号量”或“调度组”来等待某些异步任务的完成。你应该 不是 在主线程中使用。阻塞主线程最多3秒钟是不可接受的!
func isHostConnected(hostAddress : String) -> Bool { let request = NSMutableURLRequest(URL: NSURL(string: hostAddress.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)!) request.timeoutInterval = 3 request.HTTPMethod = "HEAD" let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) var responseCode = -1 let group = dispatch_group_create() dispatch_group_enter(group) session.dataTaskWithRequest(request, completionHandler: {(_, response, _) in if let httpResponse = response as? NSHTTPURLResponse { responseCode = httpResponse.statusCode } dispatch_group_leave(group) })!.resume() dispatch_group_wait(group, DISPATCH_TIME_FOREVER) return (responseCode == 200) }
备注:
response
nil
responseCode = (response as? NSHTTPURLResponse)!.statusCode