等待请求完成,然后再执行下一个操作

吐司

我想知道在执行另一段代码之前,如何等待发送请求的操作以完成上传(并获得响应)。我尝试使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

等待循环完成,然后再执行下一个功能

等待内联线程完成,然后再转到下一个方法

JavaFX等待动画方法完成,然后再转到下一个方法

Android / Java-等待AsyncTask结束,然后再执行下一个功能

在“ for”循环中使用Jquery promise()等待效果完成,然后再开始下一个效果

等待功能中的所有淡入完成,然后再启动下一个功能

我要如何等待DispatchWorkItem的响应,然后再继续处理Dispatch队列中的下一个请求或下一个DispatchWorkItem

在执行下一个操作之前,如何等待请求完成(Xcode 11)

是否等待当前迭代完成,然后再进行下一个迭代?

如何在for循环内延迟操作,然后再继续执行下一个循环

如何遍历URL数组并等待响应,然后再转到下一个

Qt Websocket发送消息并等待响应,然后再转到下一个方法

睡眠3秒,然后再使用CURL发送下一个请求

警报对话框密码验证,然后再执行下一个任务

如何在执行下一个操作(获取)之前等待所有请求完成

等待两个异步完成函数完成,然后再执行下一行代码

等待下载方法完成,然后再运行下一个.then-node.js

等待循环中的每个动画完成,然后再运行下一个动画

如何使用等待 jquery ajax 完成的 javascript 承诺,然后再进行下一个承诺?

如何等待截击响应完成然后执行下一个方法

如何在Angular 2+中执行多个http请求,但等待每个请求完成后再执行下一个?

等待完成,然后再执行下一步

等待文件上传,然后再进行下一个循环迭代?

React Redux-等待异步api调用完成,然后分派下一个操作

角度5:如何等待服务完成,然后继续执行下一个任务?

睡眠x秒,然后再运行下一个操作

等待其他会话中的多个同时Powershell命令完成,然后再运行下一个命令

如何传送Jmeter以等待线程组中的所有采样器完成,然后再进行下一个循环

等待异步函数结束,然后再执行另一个