Каков наилучший способ демультиплексировать вывод издателя? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть ObservableObject с несколькими издателями:

private class ViewModel: ObservableObject {
    @Published var top3: [SearchResult] = []
    @Published var albums: [SearchResult.Album] = []
    @Published var artists: [SearchResult.Artist] = []
}

Конечной точкой является URLSessionDataPublisher, который отправляет одну коллекцию значений, которая может быть альбомом или исполнителем (на самом деле существует больше типов но я сокращаю поставленную здесь проблему.) Как лучше всего объединить эту коллекцию в 3 коллекции: [Album], [Artist] и массив из 3 результатов, которые могут быть либо Artist, либо Album?

DatabaseRequest.Search(for: searchTerm)
    .publisher()
    // now i want to separate the collection out into [Album] and [Artist] and assign to my 3 @Published vars
    .receive(on: DispatchQueue.main)
    .sink { }
    .store(in: bag)

1 Ответ

0 голосов
/ 13 марта 2020

Вы столкнулись с некоторой (распространенной) ошибкой, что Combine отвечает за передачу измененных данных в SwiftUI. Это не так. Единственное, что здесь делает Combine, - это сообщение без содержимого, что некоторые данные изменились, а затем компоненты SwiftUI, которые используют соответствующий объект модели go и ищут свои данные.

Передача данных в SwiftUI полностью использует Binding, которые по сути являются get и set замыканиями под крышками.

Так что вам не нужно беспокоиться о демультиплексировании объединенного потока - и нет такого, в котором есть «один» из этих видов данных. Комбинат будет иметь проблемы с этим, так как он строго типизирован как для типа вывода, так и типа сбоя.

Об этом немного больше написано в Использование Combine в главе SwiftUI и Combine (ссылка на бесплатную версию HTML)

...