如果在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;
}
答案 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)
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")
}
}
}
func loadDataWithConnectionCheck() {
NetworkManager.request(string: "https://itunes.apple.com/search?term=jack+johnson") { json in
print(json)
}
}
使用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
}
}
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
}
}