比方说,我必须每秒进行一次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工具进行检查时,对能量的影响更大,实现这一目标的最有效方法是