我想知道在执行另一段代码之前,如何等待发送请求的操作以完成上传(并获得响应)。我尝试使用NSOperations做到这一点:
let testOp = BlockOperation {
var result = 0
for i in 1...1000000000 {
result += i
}
}
let logOp = BlockOperation {
self.debug.log(tag: "test", content: "testing")
}
logOp.completionBlock = {
print("------- logOp completed")
}
logOp.addDependency(testOp)
let sendOp = BlockOperation {
self.debug.sendLog() //uploads log, using URLSession.shared.dataTask
}
sendOp.completionBlock = {
print("------- sendOp completed")
}
sendOp.addDependency(logOp)
let emptyOp = BlockOperation {
self.debug.empty()
}
emptyOp.completionBlock = {
print("------- emptyOp completed")
}
emptyOp.addDependency(sendOp)
let queue = OperationQueue()
queue.addOperations([testOp, logOp, sendOp, emptyOp], waitUntilFinished: false)
输出:
------- logOp completed
*** Sending debug log (coming from self.debug.sendLog())
------- sendOp completed
------- emptyOp completed
*** sendLog uploaded (coming from self.debug.sendLog())
根据我的代码,我希望输出为:
------- logOp completed
*** Sending debug log
*** sendLog uploaded
------- sendOp completed
------- emptyOp completed
我该怎么做?我可以使用NSOperations做到这一点吗?
有关debug.sendLog()函数的其他详细信息:
func sendLog() {
...
var urlRequest = URLRequest(url: url!)
urlRequest.httpMethod = "POST"
...
let session = URLSession.shared
let task = session.dataTask(with: urlRequest, completionHandler: {
(data, response, error) in
...
DispatchQueue.main.async {
print("*** sendLog uploaded")
}
})
task.resume()
}
您可以将完成块直接添加到sendLog
方法中,并丢弃所有块操作内容。
func sendLog(withCompletion completion: (() -> Void)) {
...
var urlRequest = URLRequest(url: url!)
urlRequest.httpMethod = "POST"
...
let session = URLSession.shared
let task = session.dataTask(with: urlRequest, completionHandler: {
(data, response, error) in
...
completion?()
})
task.resume()
}
然后sendLog
像这样调用您的方法:
sendLog(withCompletion: {
// Execute the code you want to happen on completion here.
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句