如何让任务在 Swift 3 中等待完成

Posted

技术标签:

【中文标题】如何让任务在 Swift 3 中等待完成【英文标题】:How do I make task wait for completion in Swift 3 【发布时间】:2017-06-26 19:34:48 【问题描述】:

我正在使用 Alamofire 向 HTTP 服务器发送登录请求。它返回一个 JSON 响应。我的问题是主线代码在 .responseJSON 之前完成。如何等到响应返回后再从函数返回?

var ret: Bool = true
Alamofire.request(
        URL(string: "http://localhost:8081/login/iPhone")!,
        method: .post,
        parameters: ["email":"test@test.test", "password":"test", "uuid":String(describing: UIDevice.current.identifierForVendor!.uuidString)],
        headers: [:])
    .validate()
    .responseJSON(response) -> Void in
        do 
            guard response.result.isSuccess else 
                throw FieldError.fetchError(responseError: response.result.error)
            
            guard let value = response.result.value as? [String: Any],
                    let status = value["status"] as? String,
                    let message = value["message"] as? String else 
                throw FieldError.messageFormatError
            
            switch status 
                case "Login suggess":
                    break
                default:
                    throw FieldError.fieldServerError(status: status, message: message)
            
         catch 
            ret = false
            debugPrint(error)
        
    
return ret

【问题讨论】:

代码在.responseJSON中执行do之前到达return语句。 别等了。使用完成处理程序返回布尔返回值和错误。 我假设responseJSON中的block是一个completion handler。问题是如何防止ios平台上的登录过程在completion handler完成之前完成。 【参考方案1】:

你总是可以使用全局

typealias DownloadComplete = () -> ()

下一个你是 json 的 func

func yourFunc(completed: @escaping DownloadComplete)

下载后使用

completed()

【讨论】:

做到了。我实际上错过了 completed()

以上是关于如何让任务在 Swift 3 中等待完成的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 我如何等待 dispatch_async 完成?

让线程在开始下一组任务之前等待所有任务完成

如何等待 ExecutorService 中的一个正在运行的线程完成分配另一个任务

您如何等待任务计划程序任务在批处理文件或 C# 中完成?

如何在 Java 中等待多个任务完成?

如何将任务委托给主线程并等待其执行完成?