使用Alamofire处理超时

时间:2016-04-14 14:23:35

标签: swift alamofire

是否可以为Alamofire请求添加超时处理程序?

在我的项目中,我用这种方式使用Alamofire:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
     modelBuilder.Entity<category>().ToTable("category");
 }

编辑:

请求失败消息

  

错误域= NSURLErrorDomain代码= -1001&#34;请求超时。&#34; UserInfo = {NSUnderlyingError = 0x7fc10b937320 {错误域= kCFErrorDomainCFNetwork代码= -1001&#34;(null)&#34; UserInfo = {_ kCFStreamErrorCodeKey = -2102,_kCFStreamErrorDomainKey = 4}},NSErrorFailingURLStringKey = url,NSErrorFailingURLKey = url,_kCFStreamErrorDomainKey = 4,_kCFStreamErrorCodeKey = -2102,NSLocalizedDescription =请求超时。}

9 个答案:

答案 0 :(得分:74)

您可以比较error._code,如果它等于-1001 NSURLErrorTimedOut那么您知道这是超时。

let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 120

manager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"])
        .responseJSON {
            response in
            switch (response.result) {
            case .success: // succes path 
            case .failure(let error):
                if error._code == NSURLErrorTimedOut {
                    print("Request timeout!")
                }
            }
        }

答案 1 :(得分:20)

Swift 3

接受的答案对我没用。

经过大量研究,我确实喜欢这个。

let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 120

manager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"])

答案 2 :(得分:10)

Swift 3,Alamofire 4.5.0

我想为项目中的每个HTTP调用设置相同的超时

关键的想法是将 Alamofire会话管理器 声明为全局变量。然后创建 URLSessionConfiguration 变量,以秒为单位设置其超时并将其分配给管理器。

项目中的每个调用都可以使用此配置的会话管理器

在我的情况下,全局 Alamofire会话管理器变量在 AppDelegate 文件中设置(全局),其配置在其 didFinishLaunchingWithOptions 方法中进行管理

<强> AppDelegate.swift

import UIKit

var AFManager = SessionManager()

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 4 // seconds
        configuration.timeoutIntervalForResource = 4 //seconds
        AFManager = Alamofire.SessionManager(configuration: configuration)

        return true
    }
    ...
}

从现在起,可以使用 afManager 从应用的任何部分调用 Alamofire请求功能。

例如:

AFManager.request("yourURL", method: .post, parameters: parameters, encoding: JSONEncoding.default).validate().responseJSON { response in
    ...
}

答案 3 :(得分:4)

Swift 3.x

class NetworkHelper {
    static let shared = NetworkHelper()
    var manager: SessionManager {
        let manager = Alamofire.SessionManager.default
        manager.session.configuration.timeoutIntervalForRequest = 10
        return manager
    }
    func postJSONData( withParams parameters: Dictionary<String, Any>, toUrl urlString: String, completion: @escaping (_ error: Error,_ responseBody: Dictionary<String, AnyObject>?)->()) {
        manager.request(urlString, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in 
            if let error = response.result.error {
                if error._code == NSURLErrorTimedOut {
                    print("Time out occurs!")
                }
            }
        }
    }
}

答案 4 :(得分:2)

Swift 5,Alamofire 5

我发现,与最新版本的Alamofire兼容的最干净的方法如下:

AF.request(url).response { (dataResponse: AFDataResponse<Data?>) in
    switch dataResponse.result {
    case .success(let data):
        // succes path
    case .failure(let error):
        switch error {
        case .sessionTaskFailed(let urlError as URLError) where urlError.code == .timedOut:
            print("Request timeout!")
        default:
            print("Other error!")
        }
    }
}

答案 5 :(得分:1)

Swift 3.x

接受的答案对我来说也没有用。

这项工作对我来说!

let url = URL(string: "yourStringUrl")!
var urlRequest = URLRequest(url: url)
urlRequest.timeoutInterval = 5 // or what you want

之后:

Alamofire.request(urlRequest).response(completionHandler: { (response) in
    /// code here
}

答案 6 :(得分:1)

快捷键4

这是我的方法和超时功能可行,同时针对api类练习单例。 来自here

的引用
struct AlamofireManager {
    static let shared: SessionManager = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 5
        let sessionManager = Alamofire.SessionManager(configuration: configuration, delegate: SessionDelegate(), serverTrustPolicyManager: nil)
        return sessionManager
    }()
}

class Auth {
    static let api = Auth()

    private init() {}

    func headers() -> HTTPHeaders {
        return [
            "Accept": "XXX",
            "Authorization": "XXX",
            "Content-Type": "XXX"
        ]
    }

    func querySample() {

        AlamofireManager.shared.request("api_post_url", method: .post, parameters: ["parametersKey": "value"], encoding: JSONEncoding.default, headers: headers())
            .responseJSON(queue: DispatchQueue.global(), options: []) { (response) in
            switch response.result {
            case .success(let value):
                // do your statement
            case .failure(let error):
                if error._code == NSURLErrorTimedOut {
                    // timeout error statement
                } else {
                    // other error statement
                }
            }
        })
    }

    func queryOtherSample() {

        AlamofireManager.shared.request("api_get_url", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers())
            .responseJSON(queue: DispatchQueue.global(), options: []) { (response) in
            switch response.result {
            case .success(let value):
                // do your statement
            case .failure(let error):
                if error._code == NSURLErrorTimedOut {
                    // timeout error statement
                } else {
                    // other error statement
                }
            }
        })
    }

}

答案 7 :(得分:0)

扩展SessionManager并编写一个像这样的公共变量

extension SessionManager {
    public static let custom: SessionManager = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = requestTimeOutInterval
        configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders

        return SessionManager(configuration: configuration)
    }()
}

答案 8 :(得分:0)

对于具有 Alamofire> = 5.0 Swift 3.x / Swift 4.0 / Swift 5.0 用户

>

使用请求修饰符来增加和减少超时间隔。

Alamofire的请求创建方法提供了最通用的自定义参数,但有时这些还不够。创建请求时,可以使用RequestModifier闭包来修改从传递的值创建的URLRequest。例如,要将 URLRequest的 timeoutInterval 设置为120秒,请在闭包中修改请求。

var manager = Session.default
 manager.request(urlString, method: method, parameters: dict, headers: headers, requestModifier: { $0.timeoutInterval = 120 }).validate().responseJSON { response in

OR

RequestModifiers也可以使用结尾闭包语法。

var manager = Session.default
     manager.request("https://httpbin.org/get") { urlRequest in
    urlRequest.timeoutInterval = 60
    urlRequest.allowsConstrainedNetworkAccess = false
}
.response(...)

您也可以检查它here