Как вернуть логическое значение в обработчике завершения в Swift - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь реорганизовать свой код и хотел бы вернуть 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 ]

6 голосов
/ 07 марта 2019

Вы, вероятно, слишком обдумываете это. Здесь не нужно «закрытие»; не требуется "обработчик завершения". Ничего асинхронного не происходит. Просто включите 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)
}
0 голосов
/ 07 марта 2019

Ваша проблема в том, что вы хотите вернуть результат, который был получен асинхронно за 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)), и использовать результат только в блоке завершения.

...