【问题标题】:Check if NSURLrequest is valid?检查 NSURLrequest 是否有效?
【发布时间】:2015-04-11 00:17:12
【问题描述】:

我有以下功能。它在 ViewDidLoad() 中运行。我正在尝试向 iPhone 应用程序添加一些错误处理以实现非连接。本质上,我希望程序检查 URLrequest 是否可以连接到其目标 URL 并将适当的文本打印到控制台。

我已经找到了一些以前的问题来解决 obj C 中的问题,但是我找不到任何关于如何在 Swift 中解决问题的好信息。有什么帮助吗?

func loadURL(){
        let requestURL = NSURL(string: path)
        let request = NSURLRequest(URL: requestURL!)
        if(/* ??? */){
            webViewer.loadRequest(request)
            println("Good connection")
        }
        else{
            println("No connection")
        }
    }

【问题讨论】:

    标签: ios swift nsurlconnection nsurl nsurlrequest


    【解决方案1】:

    这里有各种指向正确方向的指针(尤其是 David 的),但要理解的关键是,如果不实际执行请求并得到响应,就不可能确认与服务的连接(即使这样也不能保证您的下一个请求将成功)。所以正确的答案是只异步执行请求并处理结果或错误。不要尝试检测连接性然后加载请求。只需加载请求。如果未连接,则会收到错误消息。

    来自 user2509601 的回答很有用,但它只告诉您设备会尝试发出请求。它不会告诉您请求会成功。所以它可以提供负面的信息(甚至不值得尝试),但它实际上并不能告诉你你已经连接了。在大多数情况下,检查可达性是浪费时间。您不妨尝试提出请求。 (可达性对于帮助您决定下一个何时尝试请求非常有用。)

    【讨论】:

    • 我想这会引发 swift 中错误处理的问题。再往下我去兔子洞……
    • 我同意。最好先发送请求,然后适当地处理错误,而不是先检查连接性。
    【解决方案2】:

    可以检查互联网连接的可用性:

    import Foundation
    import SystemConfiguration
    
    public class Reachability {
    
        class func isConnectedToNetwork() -> Bool {
    
            var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
            zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
            zeroAddress.sin_family = sa_family_t(AF_INET)
    
            let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
                SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
            }
    
            var flags: SCNetworkReachabilityFlags = 0
            if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
                return false
            }
    
            let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
            let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    
            return (isReachable && !needsConnection) ? true : false
        }
    
    }
    

    取自这里:Check for internet connection availability in Swift

    【讨论】:

      【解决方案3】:

      大概webViewerUIWebView的一个实例

      UIWebView 一起处理连接故障的适当方法是通过委托方法。

      class FooViewController : UIViewController, UIWebViewDelegate {
          var webViewer : UIWebView!
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              webViewer.delegate = self       // better yet, set this in the storyboard
          }
      
          func webView(webView: UIWebView, didFailLoadWithError error: NSError) {
              // Handle a failure to load the url here
          }
      
          func webViewDidFinishLoad(webView: UIWebView) {
              // Handle successful load here
          }
      }
      

      【讨论】:

        【解决方案4】:

        我用什么来检查连接:

         let request = NSURLRequest(URL: NSURL(string: yourURL)!)
        
         NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, data, error) -> Void in
             if data == nil {
                 println("Connection error")
                 return
             }
             else {
                 println("Connection successful")
             }
            )}
        

        您也可以发送同步请求。

        【讨论】:

          【解决方案5】:

          为了避免编写过多的代码,我建议您查看一个开源组件来解决这个问题。 Mattt Thompson 将他出色的 AFNetworking 库作为 Alamofire 移植到 Swift,其中包含(以及许多其他非常有用的东西)AFNetworkReachabilityManager,这对于确定网络可用性很有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-24
            • 2015-11-26
            • 2017-02-28
            • 2011-09-06
            • 2011-04-07
            • 2013-10-29
            • 2020-06-05
            • 1970-01-01
            相关资源
            最近更新 更多