Расчет скорости сети в iOS. Время в оба конца с меньшим количеством данных не сообщит о точной скорости сети
Я пытаюсь рассчитать скорость сети в своем приложении, поэтому я могу загружать только ту часть данных, которая может быть загружена в таких условиях сети. Для этого мой план:
- Мое приложение будет иметь скорость по умолчанию может быть (500 КБ / с).
- Мое приложение отправит запрос с 500 КБ данных.
- Он будет следить за временем прохождения сигнала в оба конца, чтобы загрузить данные и получить ответ. Например, приложение получило 200 КБ данных за 5 секунд, после чего скорость будет (500+200)/5.
- Согласно приведенному выше примеру, моя пропускная способность составляет 140 КБ / с для этого запроса.
- Я буду рассчитывать экспоненциальное скользящее среднее из моей пропускной способности.
- Я отправлю следующий запрос на основе рассчитанной средней пропускной способности.
Вот моя реализация для NSURLSession:
//Initializing NSURLSession [one time only]
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.test.ios.background")
self.backgroundSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
// Create session task:
var urlSessionTask = self.backgroundSession.uploadTaskWithRequest(request, fromFile: NSURL.fileURLWithPath(filePath!)) urlSessionTask.resume()
let requestStartTime = NSDate().timeIntervalSinceReferenceDate
//On didCompleteWithError calculating speed.
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
let downloadEndTime = NSDate().timeIntervalSinceReferenceDate
let networkSpeed = Int(Double(sessionTask.receivedData.length + task.countOfBytesSent) / (downloadEndTime - requestStartTime))
}
Если я теряю пропускную способность, я могу найти ее, используя этот подход, поскольку мое среднее значение снижается, но проблема заключается в том, что, как только я достиг низкой пропускной способности и чем улучшаются условия моей сети, моя пропускная способность не улучшится, потому что я продолжаю посылать меньше данных в запросе, и он будет продолжать говорить, что пропускная способность низкая.
Есть ли способ узнать, улучшилось ли состояние моей сети, и могу ли я отправлять больше данных?
На мой взгляд, одно решение заключается в том, что я могу отправлять максимум данных (может быть 500 КБ) в каждом 10-м запросе, поэтому в это время я могу получить более высокую пропускную способность в условиях сети, которые улучшаются.
1 ответ
Чтобы получить такие показатели, как время начала и окончания запроса, я бы порекомендовал реализовать следующий метод делегата в вашем URLSession
@available(iOS 10.0, *)
optional public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)
URLSessionTaskMetrics
содержит свойство taskInterval
который даст вам время поездки туда и обратно.
Что касается динамического изменения объема данных, которые вы отправляете, я не понимаю подход. Независимо от размера вашего тела запроса, ваше приложение ограничено пропускной способностью сети; который находится вне вашего контроля. Вы можете попробовать использовать новый URLSessionConfiguration
свойство максимизировать пропускную способность сети:
@available(iOS 11.0, *)
open var multipathServiceType: URLSessionConfiguration.MultipathServiceType
Я рекомендую оставить заявку body
как есть и позволяя ОС разобраться с мельчайшими деталями оптимизации для плохого сетевого подключения.