Ios Alamofire回调永远不会返回
我正在使用Alamofire库向stackexchange api发出GET请求,我想将从JSON获得的结果保存在一个数组中,问题是alamofire任务是异步的,我需要它提供的数据来完成我的工作,如表单元格插入等。我试图使用信号量让我的程序等待调用,但调用从未到达signal()。为什么会发生这种情况?这是异步调用终止后继续工作的另一种方式吗?我对这东西很陌生,所以我不太了解,非常感谢您的帮助。代码如下:Ios Alamofire回调永远不会返回,ios,swift,http,networking,Ios,Swift,Http,Networking,我正在使用Alamofire库向stackexchange api发出GET请求,我想将从JSON获得的结果保存在一个数组中,问题是alamofire任务是异步的,我需要它提供的数据来完成我的工作,如表单元格插入等。我试图使用信号量让我的程序等待调用,但调用从未到达signal()。为什么会发生这种情况?这是异步调用终止后继续工作的另一种方式吗?我对这东西很陌生,所以我不太了解,非常感谢您的帮助。代码如下: var users:[UserInfo] = [] var number:Int = 0
var users:[UserInfo] = []
var number:Int = 0
let dispatch:DispatchSemaphore = DispatchSemaphore(value: 0)
override func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
// GET the data from the stackexchange api
let param: Parameters = [
"order": "desc",
"max" : 10,
"sort" : "reputation",
"site" : "stackoverflow"
]
Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in
if let json = response.result.value {
// we got a result
/* I know this is a bit ugly */
let json1 = json as! [String:AnyObject]
let usersInfoFromJSON = json1["items"] as! NSArray // remember to cast it as NSDictionary
for userInfo in usersInfoFromJSON {
self.number = 70 // just for test
let userDict = userInfo as! NSDictionary
self.users.append(UserInfo(newName: userDict["display_name"] as! String,
newImageURL: userDict["profile_image"] as! String))
}
}
self.dispatch.signal()
}
self.dispatch.wait()
print(self.number) // just for test
super.viewDidLoad()
}
首先,去掉Dispatch信号量。您使用它的方式将阻塞主线程。好主意 这可能与从闭包调用
tableView.reloadData()
一样简单。我还建议将数据加载放在一个单独的函数中,以防在某个时候需要从源刷新数据
var users:[UserInfo] = []
var number:Int = 0
override func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
loadData()
super.viewDidLoad()
}
func loadData() {
// GET the data from the stackexchange api
let param: Parameters = [
"order": "desc",
"max" : 10,
"sort" : "reputation",
"site" : "stackoverflow"
]
Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in
if let json = response.result.value {
// we got a result
/* I know this is a bit ugly */
let json1 = json as! [String:AnyObject]
let usersInfoFromJSON = json1["items"] as! NSArray // remember to cast it as NSDictionary
for userInfo in usersInfoFromJSON {
self.number = 70 // just for test
let userDict = userInfo as! NSDictionary
self.users.append(UserInfo(newName: userDict["display_name"] as! String,
newImageURL: userDict["profile_image"] as! String))
}
}
self.tableView.reloadData()
print(self.number) // just for test
}
}
如果你想变得聪明,你甚至可以将reloadData()移动到didSet
关闭users
。当然,如果执行此操作,请从Alamofire闭包中删除reloadData()
调用
var users:[UserInfo] = [] {
didSet {
tableView.reloadData()
}
}
首先,去掉Dispatch信号量。您使用它的方式将阻塞主线程。好主意 这可能与从闭包调用
tableView.reloadData()
一样简单。我还建议将数据加载放在一个单独的函数中,以防在某个时候需要从源刷新数据
var users:[UserInfo] = []
var number:Int = 0
override func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
loadData()
super.viewDidLoad()
}
func loadData() {
// GET the data from the stackexchange api
let param: Parameters = [
"order": "desc",
"max" : 10,
"sort" : "reputation",
"site" : "stackoverflow"
]
Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in
if let json = response.result.value {
// we got a result
/* I know this is a bit ugly */
let json1 = json as! [String:AnyObject]
let usersInfoFromJSON = json1["items"] as! NSArray // remember to cast it as NSDictionary
for userInfo in usersInfoFromJSON {
self.number = 70 // just for test
let userDict = userInfo as! NSDictionary
self.users.append(UserInfo(newName: userDict["display_name"] as! String,
newImageURL: userDict["profile_image"] as! String))
}
}
self.tableView.reloadData()
print(self.number) // just for test
}
}
如果你想变得聪明,你甚至可以将reloadData()移动到didSet
关闭users
。当然,如果执行此操作,请从Alamofire闭包中删除reloadData()
调用
var users:[UserInfo] = [] {
didSet {
tableView.reloadData()
}
}
你真的不想用self.dispatch.wait()阻塞主线程是的,你是对的,但是解决方案是什么呢?首先,去掉dispatch信号量。在Alamofire.request调用结束时,执行您需要执行的任何操作。在上面的示例中,将
print(self.number)
放在您当前拥有self.dispatch.signal()的位置。
您可能需要从那里调用以更新UI、停止微调器,无论是什么,这样就可以了,但我还有其他函数,比如TableViewDelegate所需的函数,它们需要alamofire call提供的数据。同样的原则也适用,从闭包调用这些函数。表视图委托只需立即处理没有数据的问题。一旦你有了数据,你可以调用tableview.reloadData()来显示它。你真的不想用self.dispatch.wait()阻塞主线程是的,你是对的,但是解决方案是什么呢?首先,去掉dispatch信号量。在Alamofire.request调用结束时,执行您需要执行的任何操作。在上面的示例中,将print(self.number)
放在您当前拥有self.dispatch.signal()的位置。
您可能需要从那里调用以更新UI、停止微调器,无论是什么,这样就可以了,但我还有其他函数,比如TableViewDelegate所需的函数,它们需要alamofire call提供的数据。同样的原则也适用,从闭包调用这些函数。表视图委托只需立即处理没有数据的问题。获得数据后,可以调用tableview.reloadData()来显示它。