Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-在恢复执行之前等待登录请求完成的正确方式_Swift_Api - Fatal编程技术网

Swift-在恢复执行之前等待登录请求完成的正确方式

Swift-在恢复执行之前等待登录请求完成的正确方式,swift,api,Swift,Api,我有以下代码,可以登录到web服务器,检索API令牌,然后允许应用程序继续。执行此代码后,调用函数将使用登录结果向用户报告他们是否成功登录或是否需要重试 现在,我只是让应用程序休眠3秒钟,以确保在继续之前有响应。否则,登录结果处理程序将在没有应答的情况下开始执行(因为服务器没有时间响应) 显然,这是一种可怕的做事方式。正确/快速的惯用方法是什么 func remote_login (email: String, password: String) -> Bool { login_r

我有以下代码,可以登录到web服务器,检索API令牌,然后允许应用程序继续。执行此代码后,调用函数将使用登录结果向用户报告他们是否成功登录或是否需要重试

现在,我只是让应用程序休眠3秒钟,以确保在继续之前有响应。否则,登录结果处理程序将在没有应答的情况下开始执行(因为服务器没有时间响应)

显然,这是一种可怕的做事方式。正确/快速的惯用方法是什么

func remote_login (email: String, password: String) -> Bool {
    login_result = false
    var jsonResults: NSDictionary = [:]
    let account = Account()
    let url = NSURL(string: "\(base_api_url())/login?email=\(email)&password=\(password)")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "GET"
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.addValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in

        do {
            jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
            account.setCredentials(jsonResults)  // we store an API token returned from a successful login; we don't store the users credentials locally
            self.login_result = true
        }
        catch {
            print("\n\n\n Login Error \n\n\n")
        }
    }) // task
    task.resume()
    sleep(3)  //need time for the response to come back...s/b far more elegant way to do this.
    return self.login_result
}
使用a作为函数参数,如下所示:

func remote_login(email: String, password: String, completion((Bool) -> Void)) {
然后,在完成(JSON解析后)时调用闭包,如下所示:

self.login_result = true
completion(login_result)
remote_login("email", "password", {
    success in

    //Logged in successfully    
}
因此,当您使用该函数时,它将如下所示:

self.login_result = true
completion(login_result)
remote_login("email", "password", {
    success in

    //Logged in successfully    
}
HTTP请求完成时将调用闭包。

我所能看到的最好结果是:

func remote_login (email: String, password: String, myFunctionCompletionHandler: ()->()) -> Bool {
    login_result = false
    var jsonResults: NSDictionary = [:]
    let account = Account()
    let url = NSURL(string: "\(base_api_url())/login?email=\(email)&password=\(password)")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "GET"
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.addValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in

        do {
            jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
            // we store an API token returned from a successful login; we don't store the users credentials locally
            account.setCredentials(jsonResults) 
            myFunctionCompletionHandler()
            // is this needed as it's handled by the handler?
            self.login_result = true
        }
        catch {
            myFunctionCompletionHandler()
            print("\n\n\n Login Error \n\n\n")
        }
    }) // task
    task.resume()
    return self.login_result
}
您可能需要重构一些东西来更好地处理completionHandler,因为我只是字面上的“plonked in”,但这应该可以做到:)


只需处理并将“failed and passed”(失败并通过)正确地传递给它:)

您需要添加一个完成处理程序,其中将返回web api的响应,然后在代码中检查响应是否正确。我知道这是一个旧答案,但它成功地解决了我的问题。作为一个新的Swift开发者,这是一个救星。谢谢你,硫磺。