para - Comprobando el tiempo de respuesta de API en iOS usando Swift 3?
swift apple (1)
Sé para probar que el tiempo de respuesta de la API se hace básicamente por el servidor o por el lado de Backend, pero como estoy trabajando para una aplicación, también debo verificar el tiempo de respuesta de la API desde iOS End.
Cómo puedo hacer esto ? He leído algunos enlaces donde dice hacer esto usando el inicio del temporizador y el final del temporizador y luego encuentro el tiempo de respuesta por endTime - startTime, pero esto no parece práctico.
Quiero usar Xcode (incluso si XCTest está allí).
Aquí está mi uno de API (escribí todo el método de consumo del servicio web en clases separadas en la clase ApiManager):
LoginVC :
//Call Webservice
let apiManager = ApiManager()
apiManager.delegate = self
apiManager.getUserInfoAPI()
ApiManager :
func getUserInfoAPI() {
//Header
let headers = [
"Accept" : "application/json",
"Content-Type" : "application/json",
]
//Call Web API using Alamofire library
AlamoFireSharedManagerInit()
Alamofire.request(HCConstants.URL, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
do{
//Checking For Error
if let error = response.result.error {
//Stop AcitivityIndicator
self.hideHud()
//Call failure delegate method
//print(error)
self.delegate?.APIFailureResponse(HCConstants.EXCEPTION_MESSAGES.SERVICE_FAILURE)
return
}
//Store Response
let responseValue = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions()) as! Dictionary<String, AnyObject>
print(responseValue)
//Save token
if let mEmail = responseValue[HCConstants.Email] as? String {
UserDefaults.standard.setValue(mEmail, forKey: HCConstants. mEmail)
}
//Stop AcitivityIndicator
self.hideHud()
//Check Success Flag
if let _ = responseValue["info"] as? String {
//Call success delegate method
self.delegate?.apiSuccessResponse(responseValue)
}
else {
//Failure message
self.delegate?.APIFailureResponse(responseValue["message"] as? String ?? HCConstants.EXCEPTION_MESSAGES.SERVICE_FAILURE)
}
} catch {print("Exception is there "}
}
}
No hay necesidad de un Timer
, solo puede usar objetos Date
. Debe crear un objeto Date
que represente la fecha actual en el momento de iniciar su solicitud API y en el control de finalización de su solicitud API, use Date().timeIntervalSince(date: startDate)
para calcular el número de segundos transcurridos.
Suponiendo que tiene una función para sus solicitudes que devuelve un cierre como un manejador de finalización, así es como puede medir su tiempo de ejecución:
let startDate = Date()
callMyAPI(completion: { returnValue in
let executionTime = Date().timeIntervalSince(date: startDate)
})
Xcode en sí mismo no tiene ninguna herramienta de creación de perfiles, pero puede usar Time Profiler en los instrumentos, sin embargo, no estoy seguro si daría los resultados correctos para las funciones asincrónicas.
Solución para su función específica: puede guardar el día de startDate
justo después de la llamada a la función. Luego puede medir el tiempo de ejecución en varios lugares (incluido cada uno): justo después de que finalice la solicitud de red (al comienzo del controlador de finalización) y en cada if statement
justo antes de que se llame al método delegado.
func getUserInfoAPI() {
let startDate = Date()
...
Alamofire.request(HCConstants.URL, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
//calculate the time here if you only care about the time taken for the network request
let requestExecutionTime = Date().timeIntervalSince(date: startDate)
do{
if let error = response.result.error {
self.hideHud()
let executionTimeWithError = Date().timeIntervalSince(date: startDate)
self.delegate?.APIFailureResponse(HCConstants.EXCEPTION_MESSAGES.SERVICE_FAILURE)
return
}
//Store Response
...
//Check Success Flag
if let _ = responseValue["info"] as? String {
//Call success delegate method
let executionTimeWithSuccess = Date().timeIntervalSince(date: startDate)
self.delegate?.apiSuccessResponse(responseValue)
}
else {
//Failure message
let executionTimeWithFailure = Date().timeIntervalSince(date: startDate)
self.delegate?.APIFailureResponse(responseValue["message"] as? String ?? HCConstants.EXCEPTION_MESSAGES.SERVICE_FAILURE)
}
} catch {print("Exception is there "}
}
}