如何在Swift中的完成处理程序中返回布尔值

时间:2019-03-07 15:14:22

标签: ios swift closures completionhandler

我正在尝试重构代码,并想在Bool内返回closure。当我尝试它时,它说它是未使用的并且不起作用。我可以用另一种方式来做,但是我要重复不想做的代码。我该怎么办。

func tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool {

    // These lines are the one that work but would like to get rid of them
    if let rowConversation = self.objectAtIndexPath(pIndexPath) as? Conversation {
        if rowConversation.isGroupChat && rowConversation.expired  {
            return true
        }
    }

    self.getRowConversation(pIndexPath: pIndexPath) {
        // how to return true here
    }
    return false
}

private func getRowConversation(pIndexPath: IndexPath, completion pCompletion: () -> Void) {
    if let rowConversation = self.objectAtIndexPath(pIndexPath) as? Conversation {
        if rowConversation.isGroupChat && rowConversation.expired  {
            ConversationManager.shared.deleteConversationID(rowConversation.conversationID)
            pCompletion()
        }
    }
}

2 个答案:

答案 0 :(得分:6)

您可能对此考虑过度。这里不需要“关闭”;不需要“完成处理程序”。没有异步发生。只需将getRowConversation变成返回Bool的普通函数即可;调用它,并将结果传回给您。

private func getRowConversation(pIndexPath: IndexPath) -> Bool {
    if let rowConversation = self.objectAtIndexPath(pIndexPath) as? Conversation {
        if rowConversation.isGroupChat && rowConversation.expired  {
            ConversationManager.shared.deleteConversationID(rowConversation.conversationID)
            return true
        }
    }
    return false
}

并这样称呼它:

func tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool {
    return self.getRowConversation(pIndexPath: pIndexPath)
}

答案 1 :(得分:0)

您的问题是,您想返回getRowConversation(pIndexPath: pIndexPath)中异步产生的结果,然后再传递该结果,即在tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool中调用此函数之后。
根本不可能,因为目前尚不知道结果。
您必须更改(如果可能的话)函数tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool,以便也有一个回调,例如
tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath, completion: @escaping ((Bool) -> Void)),并仅在完成块中使用结果。