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