gpt4 book ai didi

Swift Alamofire SwiftyJSON 异步/同步类方法

转载 作者:搜寻专家 更新时间:2023-10-30 22:09:54 25 4
gpt4 key购买 nike

所以我目前有以下内容:

class ViewController: UIViewController {

class Identity{
let baseUrl = "superSecretURL"
var _username: String = ""
var _password: String = ""
var _apiKey: String = ""

init(){

}

init(username: String, apiKey: String){
_username = username
_apiKey = apiKey
}

init(username: String, password: String){
_username = username
_password = password
}

func loginPassword() -> String{
var loginJSON = ["auth": ["passwordCredentials": ["username": _username, "password": _password]]];
var returnJSON: String

request(.POST, baseUrl, parameters: loginJSON, encoding: .JSON)
.responseJSON { (request, response, data, error) in
if let anError = error
{
// got an error in getting the data, need to handle it
println("error calling POST on /posts")
println(error)
}
else if let data: AnyObject = data
{
// handle the results as JSON, without a bunch of nested if loops
let post = JSON(data)
// to make sure it posted, print the results
println("JSON Returned")
}
}
}
}

var i = Identity(username: "secretName", password: "complicatedPassword")

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

println("Before Call")



println("After Call")

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}


}

基本上,我希望能够调用 println("Before Call"),然后接收来自 loginPassword() 方法的响应,然后是 println("After Call")。我相信这是同步的,但我想不出一种方法让它工作,整个线程的事情让我感到困惑。

我基本上想说:

if i.loginPassword(){ // do some login stuff }else{ // do some error stuff }

感谢任何帮助或指点。

最佳答案

您需要在 loginPassword() 函数中设置一个随时调用的回调函数。

这可能是实现它的一种方式:

func loginPassword(callback: ((isOk: Bool)->Void)?) -> String{
var loginJSON = ["auth": ["passwordCredentials": ["username": _username, "password": _password]]];
var returnJSON: String

request(.POST, baseUrl, parameters: loginJSON, encoding: .JSON)
.responseJSON { (request, response, data, error) in
if let anError = error{
// got an error in getting the data, need to handle it
println("error calling POST on /posts")
println(error)

callback?(isOk: false)
}
else if let data: AnyObject = data{
// handle the results as JSON, without a bunch of nested if loops
let post = JSON(data)
// to make sure it posted, print the results
println("JSON Returned")

callback?(isOk: true)
}
}
}

然后……

override func viewDidLoad() {
super.viewDidLoad()

var identity = Identity(username: "John Apleseed", apiKey: "213123123")

identity.loginPassword { (isOK) -> Void in
if (isOK) {
//do good stuff here
}else{
// do error handling here
}

}
}

更新

此外,您的调用函数可以如下所示:

override func viewDidLoad() {
super.viewDidLoad()

var identity = Identity(username: "John Apleseed", apiKey: "213123123")
identity.loginPassword(handlePasswordRequest)
}

并且您可以根据需要添加任意数量的回调处理程序,而无需弄乱一堆嵌套的闭包...

private func handlePasswordRequest(isOK: Bool){
if (isOK) {
//do good stuff here
}else{
// do error handling here
}
}

更新 2

如果您需要调用调用层次结构深处的回调,则需要将回调作为每个先前闭包的参数传递。

更新 3

我会尝试 RxAlamofire 和所有关于 RxSwift

关于Swift Alamofire SwiftyJSON 异步/同步类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30197985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com