什么是每秒进行网络呼叫而不影响更高能量影响的最有效方法

时间:2019-07-03 10:37:16

标签: swift timer nstimer nsurlsession nsoperation

比方说,我必须每秒进行一次api调用才能从服务器获取汇率,最有效的方法是什么?

我有一个operationmaxConcurrentOperationCount = 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工具进行检查时,对能量的影响更大,实现这一目标的最有效方法是

0 个答案:

没有答案