繁体   English   中英

在表视图委托方法中发出异步请求

[英]Make async request in table view delegate method

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

    // ...
}

简而言之,不要尝试。 委托方法需要立即返回有效结果。 您可以使用信号量或调度组来欺骗技巧,以阻止委托方法返回,直到您从服务器获得结果为止,但这确实是一个主意。

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

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

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

如果您可以提前调用API,然后在delete操作中比较这些值,那就太好了。 对用户而言,它将更具交互性。

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

如您所知,您无法从异步任务中返回任何内容。

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

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

我什canEditRowAt会实现canEditRowAt并根据该属性返回truefalse

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM