所以我有一个带有项目列表的 TableView 。只有具有最高权限级别的用户才能删除这些项目。当用户滑动 TableView 单元格以将其删除时,将调用 editActionsOptionsForRowAt
。我通过进行服务器调用(异步)来检查此委托(delegate)方法中的用户权限。问题是我需要快速获取此信息,而且此代码无法编译,因为我无法在闭包中返回删除项。我该怎么做才能解决这个问题?
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {
// ...
APIContentService.getUserPermission(projectKey: projectKey, stepKey: stepKey, userKey: userKey) { (accessLevel) in
if let level = accessLevel {
if level == .admin {
return [delete] // show delete item – COMPILER ERROR, can't return this in a closure
} else {
//
return [] // don't show anything
}
}
}
// ...
}
最佳答案
总之,不要尝试。委托(delegate)方法需要立即返回有效结果。您可以使用信号量或分派(dispatch)组来阻止委托(delegate)方法返回,直到您从服务器获得结果,但这是一个非常糟糕的想法。
正确的解决方案是在viewDidLoad
中获取一次权限。将结果保存在属性中。然后在您的委托(delegate)方法中引用该属性。
当用户在此屏幕上时,每次 TableView 想要知道每行的编辑操作时,用户的权限都不会改变。因此,每次用户查看此屏幕时,您只需要获得一次权限。
关于ios - 在 TableView 委托(delegate)方法中发出异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46850967/