微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将NSURLConnection弃用从Swift 1.2修复为2.0

如何解决将NSURLConnection弃用从Swift 1.2修复为2.0

检查服务器上是否存在资源需要发送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)
}

备注:

  • 将HTTP方法设置为“ HEAD”是一个小的优化,因为服务器仅发送响应头,而没有实际数据。
  • 如果主机名不合法,response将是nil,并且 responseCode = (response as? NSHTTPURLResponse)!.statusCode将崩溃。

解决方法

我有一个用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上运行它?

我有理由不在这里使用“苹果的可及性”。

任何建议都会有所帮助。:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。