繁体   English   中英

如何在 swift 完成 api 调用后运行函数

[英]How to run function after an api call has been complete in swift

我希望我的函数 openDoor 返回 true,如果 API 调用给了我们 doorStatus“OPENED” 但是,我遇到了一个问题,这个函数在 API 调用之前返回,每次都返回 false,因为它有如此初始化。 我的问题是如何首先发出 api 请求,以便我可以根据该 API 调用分配 doorStatusL true 或 false 以在最后返回它?

                func openDoor(requesto: URLRequest) ->Bool {
                 var doorstatusL = false;


                func sendRequest() -> Bool {
                NSURLConnection.sendAsynchronousRequest(requesto, queue: OperationQueue.main) {(response, data, error) in

                    guard let data = data else {
                        return
                    }
                    print(String(data: data, encoding: .utf8)!)
                    do {

                        let json = try JSONDecoder().decode([WelcomeElement].self, from: data )
                        //try JSONSerialization.jsonObject(with: data!, options: [])
                        print(json[0].doorstatus)
                        if(json[0].doorstatus == "OPENED"){
                            doorstatusL = true;
                            print(doorstatusL)
                            print("assigned TRUE")
                        }
                    } catch {
                        print("Status Error during JSON serialization: \(error.localizedDescription)")
                    }
                    }
                    return true
                }
                if(sendRequest()==true){
                    print(doorstatusL)
                    print("=======+++++++")
                    return doorstatusL
                } else {
                    print("returned false at the end")
                    return false
                }  
               return true;
            }

终端的输出是

false
=======+++++++
[{"message":"OPEN, ENTER ","doorstatus":"OPENED"}] 
OPENED
true
assigned TRUE

谢谢

解决了

                        func sendRequest(requesto: URLRequest, success:Bool, completionHandler: @escaping (Bool)->Void) {
                        var doorStatusL = false

                        NSURLConnection.sendAsynchronousRequest(requesto, queue: OperationQueue.main) { (response, data, error) in
                            guard let data = data else { return }

                            do {
                                let json = try JSONDecoder().decode([WelcomeElement].self, from: data )

                                if(json[0].doorstatus == "OPENED") {
                                    doorStatusL = true
                                    completionHandler(doorStatusL)
                                }
                            } catch {
                                print("Status Error during JSON serialization: \(error.localizedDescription)")
                            }
                        }
                    }

                    let completionhandler:(Bool)->Void = { (success) in
                        if success {
                                sendNotifications()
                        }
                    }

                    sendRequest(requesto: request2, success: true, completionHandler: completionhandler)
func openDoor(requesto: URLRequest,completionHandler:@escaping (Bool) -> ()) {
    func sendRequest() -> Bool {
            NSURLConnection.sendAsynchronousRequest(requesto, queue: OperationQueue.main) {(response, data, error) in

                guard let data = data else {
                    return
                }
                print(String(data: data, encoding: .utf8)!)
                do {

                    let json = try JSONDecoder().decode([WelcomeElement].self, from: data )
                    //try JSONSerialization.jsonObject(with: data!, options: [])
                    print(json[0].doorstatus)
                    if(json[0].doorstatus == "OPENED"){
                        doorstatusL = true;
                        print(doorstatusL)
                        print("assigned TRUE")
                    }
                } catch {
                    print("Status Error during JSON serialization: \(error.localizedDescription)")
                }
                }
                completionHandler(true)
            }
            if(sendRequest()==true){
                print(doorstatusL)
                print("=======+++++++")
                completionHandler(doorstatusL) 
            } else {
                print("returned false at the end")
                completionHandler(false)
            }  
    })
}

用法:

openDoor() { requesto: urlHere,success in
   print(success)
}

转义闭包:转义闭包是在传递给它的函数返回后调用的闭包。 换句话说,它比传递给它的函数寿命更长。

非转义闭包:在它被传入的函数内调用的闭包,即在它返回之前。

你可以在这个问题中阅读更多关于它的信息: Swift @escaping and Completion Handler

将完成处理程序添加到 api 调用方法

func sendRequest(completion:@escaping (_ response:Bool) -> Void){
   completion(true)
}

然后你可以在完成时调用一个函数

sendRequest(completion: {_ in
    yourFunction()
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM