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

时间:2015-03-18 18:01:35

标签: uitableview swift

我知道之前已经提出这个问题,但提供的答案根本没有回答我的问题。

我有一个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)")
    }
}

这很好,如果您所做的只是打印值,但我需要返回值!

提前致谢

1 个答案:

答案 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]