我知道之前已经提出这个问题,但提供的答案根本没有回答我的问题。
我有一个UITableView的同步函数numberOfRowsInSection:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var returnValue = 0
self.getFavorites() { result in
returnValue = result.count
}
return returnValue
}
这是getFavorites()函数:
func getFavorites(completionHandler: (([NSString])->())){
let setter = self.xpcConnection?.remoteObjectProxy as FavoritesProtocol
setter.getFavorites({(reply) -> Void in
if var unwrappedReply = reply {
completionHandler(unwrappedReply)
}
})
}
现在numberOfRowsInSection函数返回0,因为该函数在异步函数完成之前返回。我理解这个概念。
到目前为止我找到的答案对我没有帮助的是,他们都没有真正说出如何使用您的completionHandler返回你传回的价值,他们都有非常简单的例子,如:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
self.getFavorites() { result in
println("Result count: " \(result.count)")
}
}
这很好,如果您所做的只是打印值,但我需要返回值!
提前致谢
答案 0 :(得分:6)
您“无法”在同步函数中返回异步块的结果。我在'不能'上加上引号,因为你可以做一些技巧来使其发挥作用,但你不应该在99.9%的时间内完成它们,并且只有你完全知道你在做什么。
对于您已设置的内容,这是一种非常常见的情况,您只需更改架构,以便在进行异步调用后重新加载表视图。
设置变量:
var results: [String] = []
在View Did Load中,或在任何地方,调用:
self.getFavorites() { results in
self.results = results
self.tableView.reloadData()
}
在你的柜台:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return results.count
}
然后,在索引路径的行的单元格中:
cell.textLabel.text = results[indexPath.row]