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

Jay*_*iyk 13 ios swift alamofire swift2

如果在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;

}
Run Code Online (Sandbox Code Playgroud)

And*_*kas 24

Swift 3解决方案

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

if let err = error as? URLError, err.code  == URLError.Code.notConnectedToInternet
{
    // No internet
}
else
{
    // Other errors
}
Run Code Online (Sandbox Code Playgroud)

你只是投入error了一个URLError.这有效,因为URLError实现了Error协议.以下是苹果文档的引用,供参考:

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

一旦你有了一个URLError实例,你可以简单地将它的code属性(一个URLError.Code枚举)与任何相关的枚举情况(在我们的例子中URLError.Code.notConnectedToInternet)进行比较.


Mel*_*vin 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
            }
    }
}
Run Code Online (Sandbox Code Playgroud)


erg*_*oon 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
}
Run Code Online (Sandbox Code Playgroud)


Swi*_*ier 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()
Run Code Online (Sandbox Code Playgroud)