在尝试parsingAlamofire中的结果之前,处理没有Internet连接错误
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; }
我同意@Shripada。 首先你应该使用Reachability来检查连通性。 这里有一个Swift库: https : //github.com/ashleymills/Reachability.swift
此外,您可以使用Alamofirevalidation方法之一:
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 }
Swift 3解决scheme
假设您有一个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
)进行比较。
这在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 } } }
其他方式来检查互联网连接存在
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()