swift - manager - Manejar el tiempo de espera con Alamofire
use alamofire in swift 4 (5)
Swift 3, Alamofire 4.5.0
Quería establecer el mismo tiempo de espera para cada llamada HTTP en mi proyecto.
La idea clave es declarar el Administrador de sesión de Alamofire como una variable global . Luego, para crear una variable URLSessionConfiguration , establezca su tiempo de espera en segundos y asígnelo al administrador.
Cada llamada en el proyecto puede usar este administrador de sesión configurado.
En mi caso, la variable global Alamofire Session Manager se configuró en el archivo AppDelegate (globalmente) y su configuración se administró en su método 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
}
...
}
A partir de ahora, se puede llamar a la función de solicitud de Alamofire desde cualquier parte de la aplicación utilizando afManager .
Por ejemplo:
AFManager.request("yourURL", method: .post, parameters: parameters, encoding: JSONEncoding.default).validate().responseJSON { response in
...
}
¿Es posible agregar un controlador de tiempo de espera para la solicitud de Alamofire?
En mi proyecto utilizo Alamofire de esta manera:
init() {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 30
self.alamofireManager = Alamofire.Manager(configuration: configuration)
}
func requestAuthorizationWithEmail(email:NSString, password:NSString, completion: (result: RequestResult) -> Void) {
self.alamofireManager!.request(.POST, "myURL", parameters:["email": email, "password":password])
.responseJSON { response in
switch response.result {
case .Success(let JSON):
//do json stuff
case .Failure(let error):
print("/n/nAuth request failed with error:/n /(error)")
completion(result: .ConnectionFailed)
}
}
}
EDITAR:
solicitar mensaje de error
Error de dominio = NSURLErrorDomain Code = -1001 "El tiempo de espera caducó." UserInfo = {NSUnderlyingError = 0x7fc10b937320 {Error , NSLocalizedDescription = La solicitud ha caducado.}
Puede comparar error.code
y si es igual a -1001
que es NSURLErrorTimedOut
entonces sabe que este fue un tiempo de espera.
Swift 3, Alamofire 4.0.1
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:
//do json stuff
break
case .failure(let error):
if error._code == NSURLErrorTimedOut {
//HANDLE TIMEOUT HERE
}
print("/n/nAuth request failed with error:/n /(error)")
break
}
}
Swift 2.2
self.alamofireManager!.request(.POST, "myURL", parameters:["email": email, "password":password])
.responseJSON { response in
switch response.result {
case .Success(let JSON):
//do json stuff
case .Failure(let error):
if error._code == NSURLErrorTimedOut {
//HANDLE TIMEOUT HERE
}
print("/n/nAuth request failed with error:/n /(error)")
completion(result: .ConnectionFailed)
}
}
Swift 3
La respuesta aceptada no funcionó para mí.
Después de mucha investigación me gustó esto.
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 120
manager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"])
Swift 3.x
La respuesta aceptada no funcionó para mí también.
Este trabajo para mí!
let url = URL(string: "yourStringUrl")!
var urlRequest = URLRequest(url: url)
urlRequest.timeoutInterval = 5 // or what you want
Y después:
Alamofire.request(urlRequest).response(completionHandler: { (response) in
/// code here
}
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!")
}
}
}
}
}