ios - 在 TableView 委托(delegate)方法中发出异步请求

标签 ios swift

所以我有一个带有项目列表的 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/

相关文章:

ios - 每天在服务器上保存数据

ios - Twitter 仅应用程序身份验证始终返回 401

ios - 将 UITableViewCell 类中的选择器添加到 UITableViewController 类

ios - 如何更改 UICollectionView 中某个部分的背景颜色?

ios - CAShapeLayer渲染问题

ios - 如何在 UITableView 中创建单行 View 分隔符

ios - 从单独的 .XIB 获取 UITextField 数据 - Swift/XCode

objective-c - 清除UIImage使用的内存— UIImageView.image = nil不这样做

ios - 以编程方式添加不可见的标签

objective-c - 在 Swift 中使用 CommonCrypto 进行解密