Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在表视图委托方法中发出异步请求_Ios_Swift - Fatal编程技术网

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

Ios 在表视图委托方法中发出异步请求,ios,swift,Ios,Swift,因此,我有一个带有项目列表的表视图。只有具有最高权限级别的用户才能删除这些项目。当用户滑动一个表视图单元格并打算将其删除时,将调用editActionsOptionsForRowAt。我通过进行服务器调用(异步)来检查此委托方法中的用户权限。问题是我很快就需要这些信息,加上这段代码无法编译,因为我无法在闭包中返回delete项。我能做些什么来解决这个问题 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath:

因此,我有一个带有项目列表的表视图。只有具有最高权限级别的用户才能删除这些项目。当用户滑动一个表视图单元格并打算将其删除时,将调用
editActionsOptionsForRowAt
。我通过进行服务器调用(异步)来检查此委托方法中的用户权限。问题是我很快就需要这些信息,加上这段代码无法编译,因为我无法在闭包中返回delete项。我能做些什么来解决这个问题

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
中获得一次权限。将结果保存到属性中。然后在委托方法中引用该属性


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

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

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


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

表视图中调用API调用来执行删除操作似乎不是一个好的设计。如果API请求失败或由于某些原因需要很长时间来处理,会发生什么情况

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


如果您不能提前调用API,则在API调用时显示
活动指示器
,并将其隐藏在其响应中。它将帮助您处理所有场景

表视图中调用API调用
委托删除操作似乎不是一个好的设计。如果API请求失败或由于某些原因需要很长时间来处理,会发生什么情况

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


如果您不能提前调用API,则在API调用时显示
活动指示器
,并将其隐藏在其响应中。它将帮助您处理所有场景

,因为您注意到自己无法从异步任务返回某些内容

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

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


我甚至会实现
canEditRowAt
,并根据该属性返回
true
false

当您注意到自己无法从异步任务返回某些内容时

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

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

我甚至会实现
canEditRowAt
并根据该属性返回
true
false