我有一个用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
,这里是:
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()
像sendSynchronousRequest
通过阻止它那样在MainThread上运行它?
我有理由不在这里使用“苹果的可及性”。
任何建议都会有所帮助。:)
检查服务器上是否存在资源需要发送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
将崩溃。问题内容: 有人知道如何避免以下代码的下一个警告吗? 问题答案: 如消息所示,请改用命名参数。
我想以某种方式将模式中的一列标记为“deprecated”(可能是列注释中的某种标记或其他标记),然后在代码生成过程中使该信息冒泡出来,从而在生成的代码中向该列的字段/方法添加一个注释。 JOOQ有任何与此相关的功能吗<浏览用户手册似乎没有显示任何相关内容。
这个问题只是为了让我理解这个概念。空值怎么能转换成(可丢弃的)?null不是一个类,对吗?这个问题可能很愚蠢。 我知道:
我的RecyclerAdapter的onBindViewHolder中有一个视图项。既然setBackgroundColor已被弃用,我应该怎么做?
我被告知扩展在当前版本的PHP中已不推荐使用,并将在某个时候删除。 我应该用什么来代替这个,怎么用? 例如:
问题内容: 我正在尝试使用POST从PHP页面获得简单的文本响应。我有以下代码: 虽然这段代码不会引发任何错误,但是当我这样调用它时: 即使我更改了该行,它也只会打印:“什么也没返回”: 对此: 它确实打印出正确的响应。我的变量在这里做错了吗? 问题答案: 这是在调用使用完成处理程序块/关闭的异步函数。因此,您需要在自己的代码中使用完成处理程序模式。这包括将方法的返回类型更改为,并添加一个新的闭包