簡體   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