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