所以我有一个带有项目列表的表格视图。只有具有最高权限级别的用户才能删除这些项目。当用户滑动表视图单元格以删除它时,将调用editActionsOptionsForRowAt
。我通过进行服务器调用(异步)来检查此委托方法中的用户权限。问题是我需要快速获取此信息,此代码无法编译,因为我无法在闭包中返回删除项。我该怎么做才能解决这个问题?
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
}
}
}
// ...
}
答案 0 :(得分:2)
总之,不要试试。委托方法需要立即返回有效结果。您可以使用信号量或调度组来阻止委托方法返回,直到从服务器获得结果,但这是非常糟糕的想法。
正确的解决方案是在viewDidLoad
中获得一次权限。将结果保存在属性中。然后在委托方法中引用该属性。
用户在此屏幕上时,每次表视图想要知道每行的编辑操作时,用户的权限都不会更改。因此,每次用户查看此屏幕时,您只需要获得一次权限。
答案 1 :(得分:1)
在table view
委托中调用API调用以进行删除操作似乎不是一个好的设计。如果API请求因某些原因失败或需要很长时间处理,会发生什么。
如果您可以提前调用API然后只是比较delete操作中的值,那将会很棒。它对用户来说会更具互动性。
如果您无法提前调用API,则在API调用时显示Activity Indicator
并将其隐藏在响应中。它将帮助您处理所有场景
答案 2 :(得分:1)
正如您所注意到的那样,您无法从异步任务中返回任何内容。
您必须获得viewDidLoad
中的用户权限并将状态保存在属性中。
然后根据该属性返回编辑操作。
我甚至会实施canEditRowAt
并返回true
或false
,具体取决于该属性。