Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
Uitableview 从Swift中同步函数内的异步函数返回值_Uitableview_Swift - Fatal编程技术网

Uitableview 从Swift中同步函数内的异步函数返回值

Uitableview 从Swift中同步函数内的异步函数返回值,uitableview,swift,Uitableview,Swift,我知道以前有人问过这个问题,但所提供的答案根本没有回答我的问题 我有一个同步函数,numberOfRowsInSection用于UITableView: func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { var returnValue = 0 self.getFavorites() { result in returnValue = resu

我知道以前有人问过这个问题,但所提供的答案根本没有回答我的问题

我有一个同步函数,numberOfRowsInSection用于UITableView:

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)")
    }
}
那太好了,如果你所做的只是打印值,但我需要返回值

提前感谢

您“无法”在同步函数中返回异步块的结果。我在“不能”上加了引号,因为有一些技巧可以让它发挥作用,但99.9%的时候你不应该这样做,而且只有在你确切知道自己在做什么的情况下

对于您所设置的,这是一种非常常见的情况,您只需要更改您的体系结构,以便在进行异步调用后重新加载表视图

设置一个变量:

var results: [String] = []
在视图中加载或在任何位置调用:

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]