[英]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
並根據該屬性返回true
或false
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.