2016-03-07 2 views
2

Я пытаюсь вычислить скорость сети в своем приложении, поэтому я могу загрузить только ту большую часть данных, которые могут быть загружены в таких сетевых условиях. Для этого мой план:Расчет скорости сети в iOS. Время округления с меньшим количеством данных не будет информировать о точной скорости сети.

  1. Мое приложение будет иметь скорость по умолчанию (500KB/s).
  2. Мое приложение отправит запрос, который содержит 500 КБ данных.
  3. Он будет контролировать время прохождения в оба конца системы, чтобы загрузить данные и получить ответ. например, приложение получило 200 кб данных за 5 секунд, чем скорость (500 + 200)/5.
  4. В соответствии с приведенным выше примером моя пропускная способность составляет 140 КБ/с для этого запроса.
  5. Я буду вычислять экспоненциальную скользящую среднюю из моей полосы пропускания.
  6. Я отправлю следующий запрос на основе рассчитанной средней полосы пропускания.

Вот моя реализация для 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-й запрос, поэтому в то время я могу получить более высокую пропускную способность в сетевых условиях.

+0

Как вы загружаете данные. Вы используете nsurlsession? можете ли вы написать код для понимания бэттера? –

+0

@CrazyDeveloper Я добавил код для того же самого. Да, я использую 'NSURLSession' –

ответ

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 как есть и позволить сделку OS с более тонкими деталями оптимизации для бедных подключения к сети.

+1

Просто указывая, что taskInterval - это время, с которого была создана задача, когда она будет завершена. Не так долго проходил трансфер. В моем случае я делаю: если позволить firstTransactionStartDate = metrics.transactionMetrics.first .fetchStartDate, пусть lastTransactionEndDate = metrics.transactionMetrics.last .responseEndDate { длительность = responseEndDate.timeIntervalSince (firstTransactionStartDate) }, чтобы получить истинную продолжительность? –

Смежные вопросы