是否可以为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 =请求超时。}
答案 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)
我想为项目中的每个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