Дождитесь завершения другой функции в функции MessageKit

#swift #messagekit

#swift #messagekit

Вопрос:

Благодаря людям, которые помогли мне с моим другим вопросом SA, я смог создать функцию, которая возвращает логическое значение, чтобы узнать, проголосовал ли пользователь уже за сообщение чата. Я хочу напечатать, проголосовал ли пользователь за сообщение чата с помощью функции MessageKit messageBottomLabelAttributedText . Однако я не могу использовать возвращаемое логическое значение для печати правильного текста.

Вот моя текущая функция messageBottomLabelAttributedText в MessagesDataSource:

     func messageBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {

        var bool = didAlreadyVote(message: message as! MessageType){_ in Bool.self}

        if bool as? Bool == true {
            let dateString = self.formatter.string(from: message.sentDate)
            let likeString = "Voted"
            return NSAttributedString(string: "(dateString) | (likeString)", attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)])
        } else {
            let dateString = self.formatter.string(from: message.sentDate)
            return NSAttributedString(string: dateString, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)])
        }
    }
}
  

Для справки, вот функция didAlreadyVote, с которой это сообщество помогло мне ранее:

 func didAlreadyVote(message: MessageType, completion: @escaping (Bool) -> Void) {

    // check user votes collection to see if current message matches
    guard let currentUser = Auth.auth().currentUser else {return}
    let userID = currentUser.uid
    let docRef = Firestore.firestore().collection("users").document(userID).collection("upvotes").whereField("messageId", isEqualTo: message.messageId)

    docRef.getDocuments { querySnapshot, error in

        if let error = error {
            print("Error getting documents: (error)")
            completion(false)
        } else {
            for document in querySnapshot!.documents {
                print("(document.documentID) => (document.data())")
                completion(true) /// Note that this will get called multiple times if you have more the one document!
            }
        }
    }
}
  

Когда я запускаю приложение, переменная bool ничего не возвращает. Как я могу извлечь логическое значение из функции, а затем использовать его в messageBottomLabelAttributedText?

Спасибо!

Ответ №1:

Не ждите.

didAlreadyVote ничего не возвращает. Она содержит асинхронный обработчик завершения, который передает Bool значение в качестве параметра.

Синтаксис таков

     didAlreadyVote(message: message){ boolValue in   
        if boolValue {
            let dateString = self.formatter.string(from: message.sentDate)
            let likeString = "Voted"
            return NSAttributedString(string: "(dateString) | (likeString)", attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)])
        } else {
            let dateString = self.formatter.string(from: message.sentDate)
            return NSAttributedString(string: dateString, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)])
        }
  

но вы все равно не сможете использовать ее в messageBottomLabelAttributedText , потому что вы ничего не сможете вернуть, если не реализуете также обработчик завершения, например

 func messageBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath, completion: @escaping (NSAttributedString) -> Void) {
    didAlreadyVote(message: message){ boolValue in   
        if boolValue {
            let dateString = self.formatter.string(from: message.sentDate)
            let likeString = "Voted"
            completion(NSAttributedString(string: "(dateString) | (likeString)", attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)]))
        } else {
            let dateString = self.formatter.string(from: message.sentDate)
            completion(NSAttributedString(string: dateString, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)]))
        }
    }
}
  

Комментарии:

1. спасибо за подробное объяснение! Пытаюсь переварить все это. Итак, я заменил свою messageBottomLabelAttributedText функцию на вашу выше, но теперь функция вообще не запускается при запуске приложения. Игнорирует ли MessageKit это теперь, когда был добавлен обработчик завершения?

2. Я не знаком с MessageKit. Если messageBottomLabelAttributedText это часть фреймворка, вы не можете ее изменить, и вам нужно найти другой способ обработки асинхронных данных.

3. облом, это то, чего я боялся. В любом случае спасибо!