在表视图委托方法中生成异步请求

时间:2017-10-20 14:10:59

标签: ios swift

所以我有一个带有项目列表的表格视图。只有具有最高权限级别的用户才能删除这些项目。当用户滑动表视图单元格以删除它时,将调用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
            }
        }
    }

    // ...
}

3 个答案:

答案 0 :(得分:2)

总之,不要试试。委托方法需要立即返回有效结果。您可以使用信号量或调度组来阻止委托方法返回,直到从服务器获得结果,但这是非常糟糕的想法。

正确的解决方案是在viewDidLoad中获得一次权限。将结果保存在属性中。然后在委托方法中引用该属性。

用户在此屏幕上时,每次表视图想要知道每行的编辑操作时,用户的权限都不会更改。因此,每次用户查看此屏幕时,您只需要获得一次权限。

答案 1 :(得分:1)

table view委托中调用API调用以进行删除操作似乎不是一个好的设计。如果API请求因某些原因失败或需要很长时间处理,会发生什么。

如果您可以提前调用API然后只是比较delete操作中的值,那将会很棒。它对用户来说会更具互动性。

如果您无法提前调用API,则在API调用时显示Activity Indicator并将其隐藏在响应中。它将帮助您处理所有场景

答案 2 :(得分:1)

正如您所注意到的那样,您无法从异步任务中返回任何内容。

您必须获得viewDidLoad中的用户权限并将状态保存在属性中。

然后根据该属性返回编辑操作。

我甚至会实施canEditRowAt并返回truefalse,具体取决于该属性。