【问题标题】:"await" results of tasks in SwiftSwift 中任务的“等待”结果
【发布时间】:2023-03-08 21:25:02
【问题描述】:

我来自 C# 背景,想在我的 Swift 应用程序中实现等待功能。我已经达到了我想要的结果,但我不得不使用一个信号量,我不确定这是一个好的做法。我有一个带有 alamo 请求的函数,它返回一个带有成功值的 JSON,据我所知,请求函数与完成处理程序是异步的。一旦请求完成,处理程序就会触发。问题是从该操作返回成功值。这是我正在做的一个伪代码示例:

func AlamoTest() -> Bool{
var success = false
//Do some things...
//...
//Signal from async code
let semaphore = DispatchSemaphore(value: 0)
Alamofire.request("blah blah blah", method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in {
    success = response["success"]
    if(success){
        //Do some more things
    }
    semaphore.signal() //Signal async code is done
}
//Wait until async code done to get result
semaphore.wait(timeout: DispatchTime.distantFuture)
return success
}

有没有“更好”的方法来实现我的目标?我是 Swift 及其异步结构的新手。

【问题讨论】:

  • 投反对票?认真的吗?

标签: asynchronous swift3 async-await alamofire grand-central-dispatch


【解决方案1】:

我找到的最佳解决方案是我所说的“回调链接”。我的方法示例如下所示:

func postJSON(json: NSDictionary, function: ServerFunction, completionHandler: ((_ jsonResponse: NSDictionary) -> Void)? = nil) {
    //Create json payload from dictionary object
    guard let payload = serializeJSON(json: json) else {
        print("Error creating json from json parameter")
        return
    }

    //Send request
    Alamofire.request(urlTemplate(function.rawValue), method: .post, parameters: payload, encoding: URLEncoding.default).validate().responseJSON { response in
        //Check response from server
        switch response.result {
            case .success(let data):
                let jsonResponse = data as! NSDictionary
                print("\(jsonResponse)")
                //Execute callback post request handler
                if completionHandler != nil {
                    completionHandler!(jsonResponse)
                }
            case .failure(let error):
                    print("Shit didn't work!\(error)")
            }
    }
}

最后一个参数是在原始异步操作完成后执行的闭包。你将结果传递给闭包,然后用它做你想做的事。就我而言,我想在异步操作滚动时禁用视图。您可以在您的闭包参数中启用该视图,因为在主线程上调用了 alamo 异步操作的结果。如果您不需要结果并停止链接,则 completionHandler 默认为 nil。

【解决方案2】:

您可以将此框架用于 Swift 协程 - https://github.com/belozierov/SwiftCoroutine

func AlamoTest() throws -> Bool {
    try Coroutine.await() { callback in
        Alamofire.request("blah blah blah", method: .post, parameters: parameters, encoding: .default).responseJSON { response in
            let success = response["success"]
            callback(success)
        }
    }
}

然后在协程内部调用这个方法:

DispatchQueue.main.startCoroutine {
    let result = try AlamoTest()

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 2017-06-02
    • 1970-01-01
    • 2019-02-24
    • 2017-07-22
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多