gpt4 book ai didi

swift - 在转移到 homeView 之前通过 Alamofire 获取用户数据

转载 作者:行者123 更新时间:2023-11-30 10:12:34 25 4
gpt4 key购买 nike

我想在转移到 homeView 之前使用 Alamofire 获取用户数据。在下面的代码中,我想在完成获取 jsonObj 数据后调用 self.login() 函数。你能告诉我该怎么做吗?谢谢你的好意。

@IBAction func signInWithTwitter(sender: UIButton) {

Twitter.sharedInstance().logInWithCompletion { (session: TWTRSession!, error: NSError!) -> Void in
if session != nil {

func getTwUserData(completionHandler: (responseObject: NSDictionary?, error: NSError?) -> ()){
let parameters = [
"tw_id":session.userID,
"tw_name" :session.userName,
"tw_token":session.authToken
]

Alamofire.request(.POST, self.uri.usersApi + "/tw_login", parameters: parameters, encoding: .JSON)
.responseJSON { request, response, data, error in
completionHandler(responseObject: data as? NSDictionary, error: error)
var jsonObj = JSON(data!)
var uid = jsonObj["user_id"].int
self.defaults.setObject(uid, forKey: "uid")
}
}

self.login()

} else {
println(error.localizedDescription)
}
}
}

根据 Sash 的建议进行更新。

@IBAction func signInWithTwitter(sender: UIButton) {

Twitter.sharedInstance().logInWithCompletion { (session: TWTRSession!, error: NSError!) -> Void in
if session != nil {

let group = dispatch_group_create()
dispatch_group_enter(group)

let parameters = [
"tw_id":session.userID,
"tw_name" :session.userName,
"tw_token":session.authToken
]

Alamofire.request(.POST, self.uri.usersApi + "/tw_login", parameters: parameters, encoding: .JSON)
.responseJSON { (request, response, data, error) in
var jsonObj = JSON(data!)
println(jsonObj)
var uid = jsonObj["user_id"].int
self.defaults.setObject(uid, forKey: "uid")
dispatch_group_leave(group)
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
print("4 seconds later...")

self.login()

} else {
println(error.localizedDescription)
}
}
}

最佳答案

关于将异步代码变成同步代码,有很多话要说,尤其是在 UI 线程中。我希望你有这样做的理由:)

我认为 Alamofire 没有办法将请求变成同步。

但是,在 Alamofire 之外有多种方法可以实现此目的,其中一种适用于大多数情况的方法是使用 Grand Central Dispatch 组:

let group = dispatch_group_create()        
dispatch_group_enter(group)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC * 4))
dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){
dispatch_group_leave(group)
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
print("4 seconds later...")

您应该将 dispatch_after 替换为您的网络代码,并且不要忘记在成功和失败时dispatch_group_leave(如果您有单独的处理程序)。

另请记住,这里存在死锁的危险:如果您 dispatch_after 返回主队列,它当前正忙于等待 dispatch_group 完成,这就是原因我正在调度到默认后台队列。

关于swift - 在转移到 homeView 之前通过 Alamofire 获取用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173081/

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