在尝试解析Alamofire中的结果之前处理无Internet连接错误

时间:2015-09-15 07:42:52

标签: ios swift swift2 alamofire

如果在Alamofire中没有互联网连接时发生错误,我应该如何处理。我尝试检查数据是否为零但不起作用。

以下是我如何使用Alamofire

Alamofire.request(.POST, REGISTER_URL, parameters: parameters, encoding: .JSON, headers: getAuthenticationHeader()).response { (request, response, data, errorType) -> Void in

    let resultObject: APIResults = APIResults(JSONDecoder(data!));
    let responseCode: Int = Int(resultObject.code!)!;// THIS CRASHES WHEN THERE IS NO INTERNET CONNECTION

    if (responseCode == 200) {
        available = true;
    }

    finished = true;

}

7 个答案:

答案 0 :(得分:21)

Swift 3解决方案

假设您有Error个实例,您可以执行以下操作:

if let err = error as? URLError, err.code  == URLError.Code.notConnectedToInternet
{
    // No internet
}
else
{
    // Other errors
}

您只需将error投射到URLError即可。这有效,因为URLError实现了Error协议。以下是苹果文档的引用,供参考:

  

URLError:描述URL错误域中的错误。

获得URLError个实例后,您只需将其code属性(URLError.Code枚举)与任何相关的枚举案例进行比较(在我们的示例中为URLError.Code.notConnectedToInternet} )。

答案 1 :(得分:11)

这适用于 Swift2.x

Alamofire.request(.POST, url).responseJSON { response in
    switch response.result {
        case .Success(let json):
            // internet works.  
        case .Failure(let error):

            if let err = error as? NSURLError where err == .NotConnectedToInternet {
                // no internet connection
            } else {
                // other failures
            }
    }
}

答案 2 :(得分:5)

我同意@Shripada。首先,您应该使用Reachability来检查连接性。 这里有一个Swift库:https://github.com/ashleymills/Reachability.swift

另外,您可以使用其中一种Alamofire验证方法:

Alamofire.request(.POST, REGISTER_URL, parameters: parameters, encoding: .JSON, headers: getAuthenticationHeader()).validate(statusCode: 200 ..< 300).response { (request, response, data, error) -> Void in
    if error != nil {
        println("Server responded with: \(response.statusCode)")
        return
    }

    // Handle your response data here
}

答案 3 :(得分:5)

检查现有互联网连接的其他方法

import SystemConfiguration

func connectedToNetwork() -> Bool {

        var zeroAddress = sockaddr_in()    

       zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))

        zeroAddress.sin_family = sa_family_t(AF_INET)

      guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, {
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
        }) else {
            return false
        }
        var flags : SCNetworkReachabilityFlags = []

        if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == false {

            return false

        }

        let isReachable = flags.contains(.Reachable)

        let needsConnection = flags.contains(.ConnectionRequired)

        return (isReachable && !needsConnection)

    }

let hasInternet = connectedToNetwork()

答案 4 :(得分:2)

详细

解决方案1 ​​

class NetworkManager {

    class var doesTheInternetWork: Bool {
        return NetworkReachabilityManager()!.isReachable
    }

    class func request(string: String, completion: @escaping ([String: Any]) ->()) {
        if doesTheInternetWork {
            Alamofire.request(string).responseJSON { response in

                if let error = response.error {
                    print("!!! \(error)")
                } else {
                    completion(response.result.value as? [String: Any] ?? [:])
                }
            }
        } else {
             print("no internet connection")
        }
    }
}

用法1

func loadDataWithConnectionCheck() {
    NetworkManager.request(string: "https://itunes.apple.com/search?term=jack+johnson") { json in
        print(json)
    }
}

解决方案2

  

使用PromiseKit pod

import PromiseKit

class NetworkManagerPromise {

    class var doesTheInternetWork: Promise<Bool> {
        return Promise { (resolver) in
            resolver.fulfill(NetworkReachabilityManager()!.isReachable)
        }
    }

    class func requestJSON(string: String) -> Promise<[String:Any]>  {
        return doesTheInternetWork.then { doesTheInternetWork in
            return Promise { (resolver)  in
                if doesTheInternetWork {
                    Alamofire.request(string).responseJSON { response in
                        if let error = response.error {
                            resolver.reject(error)
                        } else {
                            resolver.fulfill(response.result.value as? [String: Any] ?? [:])
                        }
                    }
                } else {
                    let error = NSError(domain: NSURLErrorDomain, code: URLError.notConnectedToInternet.rawValue, userInfo: nil) as Error
                    resolver.reject(error)
                }
            }
        }
    }
}

extension Promise {

    func catchErrors() -> Self {
        self.catch { error in
            switch error {
            case is URLError:
                if let error = error as? URLError {
                    switch error {
                    case URLError.notConnectedToInternet: print("no internet connection")
                    default: print("error")
                    }
                }
            default: break
            }
        }
        return self
    }
}

用法2

func loadDataWithConnectionCheckPromise() {
    _ = NetworkManagerPromise.requestJSON(string: "https://itunes.apple.com/search?term=jack+johnson").then { json -> Promise<Bool> in
        print(json)
        return Promise { $0.fulfill(true) }
    }.catchErrors()
}

答案 5 :(得分:1)

Swift 5.0

您可以使用与NSURL相关的错误代码

进行检查
if error._code == NSURLErrorNotConnectedToInternet {
                        
}

或者您可以检查代码

if error._code == -1009 {
                        
}

您可以在开发人员站点上检查其他代码。 https://developer.apple.com/documentation/foundation/1508628-url_loading_system_error_codes

答案 6 :(得分:0)

它可以迅速运行5

.catchError { (error: Error) in
                    if let err = error as? URLError, err.code  == URLError.Code.notConnectedToInternet {
                        // No internet
                    } else {
                        // Other errors
                    }
                }