I know to test the response time of API is basically done by Server or Backend side, but as i am working for one application, i need to check api response time from iOS End also.
How can i do this ? i read few links where it says to do this using timer start and timer end and then find the response time by endTime - startTime but this seems not handy.
I want to use Xcode (even if XCTest is there).
Here is my one of API ( i wrote all web service consume method in separate class in ApiManager class ) :
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 "}
}
}
Alamofire provides the timeline of request just response.timeline.totalDuration it provides time interval in seconds from the time the request started to the time response serialization completed.
response.timeline.totalDuration
is the correct answer.There's no need for a
Timer
, you can just useDate
objects. You should create aDate
object representing the current date at the time of starting your API request and in the completionHandler of your API request, useDate().timeIntervalSince(date: startDate)
to calculate the number of seconds that passed.Assuming you have a function for your requests that is returning a closure as a completion handler, this is how you can measure its execution time:
Xcode itself doesn't have any profiling tools, but you can use Time Profiler in Instruments, however, I am not sure if would give the correct results for asynchronous functions.
Solution for your specific function: you can save the
startDate
right after the function call. Then you can measure the execution time in several places (included each): right after the network request finishes (at the beginning of the completion handler) and in eachif statement
right before your delegate method is called.