Какой самый эффективный способ совершать сетевые вызовы каждую секунду, не оказывая влияния на энергию? - PullRequest
0 голосов
/ 03 июля 2019

Допустим, мне нужно каждую секунду совершать вызов API для получения курсов обмена с сервера. Какой самый эффективный способ добиться этого?

У меня есть operation с maxConcurrentOperationCount = 1, который запускает dataTask каждую секунду, используя timer

// Задача таймера

let timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { timer in
       self.loadRates()
   })
timer.fire()

// Функция загрузки значений в модели представления

func loadRates(){
    ratesLoader.loadRates(operationName: "\(Date().timeIntervalSinceNow)", urlString: Constants.RateURL) { data in
        self.rates = data.rates?.compactMap({ (key,value)  in
            RateModel(rates: (key, value))
            }).sorted(by: {$0.currency < $1.currency})   ?? []
   }
}

// Скорость загрузки Операция в классе OperationManager

 public let queueManager:  ROperationQueue
   func loadRates(operationName:String,urlString: String, completionHandler: @escaping (_ result: RatesResponse) ->Void) {

    let operation = RloadDataOperation(_urlstring: urlString)
    operation.qualityOfService = .background
    operation.queuePriority = .veryHigh
    operation.completionHandler = completionHandler
    operation.name = operationName
    queueManager.enqueue(operation)

}

// Операция загрузки

class RloadDataOperation: ROperation<RatesResponse> {

private let session: URLSession
private var urlRequest: URLRequest?
private var task: URLSessionTask?
private  var urlString : String?

init(session: URLSession = URLSession.shared, _urlstring: String) {
    self.session = session
    self.urlString = _urlstring

}


override public func main() {

    guard let finalUrl = URL(string: self.urlString!) else { self.cancel() ; return}
    self.urlRequest = URLRequest(url: finalUrl)
    self.urlRequest?.cachePolicy = .reloadIgnoringLocalCacheData

    if isCancelled {
        return
    }


    task = session.dataTask(with: self.urlRequest!) { [weak self] (data, response, error) in
            guard let data = data else { self?.cancel() ; return }

            let ratesData = try? JSONDecoder().decode(RatesResponse.self, from: data)
            if ratesData != nil {
                self?.complete(result: ratesData!)
                self?.cancel()
            }
    }

        task?.resume()

}

override func cancel() {
    task?.cancel()
    super.cancel()
}

} * * тысяча двадцать-один

Однако при проверке с использованием инструментов XCode я столкнулся с более сильным энергетическим воздействием, что является наиболее эффективным способом достижения этого

...