как подписаться на функцию, которая наблюдает за @Published? - PullRequest
1 голос
/ 13 июля 2020

Требуется динамически отображать список сообщений в блоке тела SwiftUI:

 var chatSpace: some View {
        List(self.viewModel.getMessages(), id: \.self) { message in
            message
        }
 }

где модель представления - это экземпляр следующего класса:

class MessagesListViewModel: ObservableObject {
    
    @ObservedObject var messageService: MessageService
    
    init(messageService: MessageService) {
        self.messageService = messageService
    }
    
    func getMessages() -> [MessageView] {
        return self.messageService.messages.map {
            return MessageView(message: $0)
        }
    }
    
    
}

Я хочу отражать изменения, когда я обновляю свойство MessageService message, как я могу этого добиться? Можно как-нибудь подписаться на изменения? Прямо сейчас я в основном добавляю сообщение, обновляя опубликованную переменную messages, однако это не вызывает повторного рисования

class MessageService: ObservableObject
{
    @Published var messages: [Message] = [Message]()
    
    func addMessage(_ sender: String, _ text: String, _ time: String) {
        self.messages.append(Message(sender: sender, text: text, time: time))
    }
}

1 Ответ

0 голосов
/ 13 июля 2020

Прямо сейчас я в основном добавляю сообщение, обновляя опубликованные сообщения var, однако это не вызывает повторного рисования

, потому что @ObservedObject var messageService: MessageService ничего не делает в MessagesListViewModel , поскольку @ObservedObject предназначен для просмотра, но не в модели представления.

Таким образом, решение должно быть таким (разделенное представление для сообщений)

struct ChatSpace: some View {
   @ObservedObject var messageService: MessageService    // << view observes messages

   var body: some View {
      List(messageService.messages, id: \.self) {
            MessageView(message: $0)
      }
   }
}
...