В чем разница между @Published и обычным свойством AnyPublisher в ObservableObject - PullRequest
0 голосов
/ 06 марта 2020

Я считаю, в чем разница

@Published var isLoggedIn: Bool = false 

var isLoggedIn: AnyPublisher<Bool, Never> 

Я знаю, что в случае с первым я могу использовать его непосредственно в SwiftUI View, т.е. создать привязку со знаком $, а затем, например, использовать if $isLoggedIn.animation()

Но как я могу добиться того же с AnyPublisher<Bool, Never>, кажется, что мне нужно куда-то позвонить назначить или раковина и store () . Чтобы это работало. Таким образом, создание привязки из него в SwiftUI кажется невозможным, как if $isLoggedIn.animation

Ограничение @Published заключается в том, что я не могу делать там пользовательские наблюдения. например UserDefaults, которые я могу сделать через AnyPublisher из UserDefaults.publisher.

Как сейчас, мне кажется, мне нужно иметь оба и сделать AnyPublisher update @Published var

Но я думал, что @Published - это оболочка свойств, которая находится под обычным AnyPublisher, так почему я не могу сделать привязку в представлении SwiftUI непосредственно из AnyPublisher?

Ответы [ 2 ]

4 голосов
/ 06 марта 2020

Combine's @Published - это издатель, завернутый в оболочку свойств. Это дает ему свойство с префиксом $ и другие функции, на которые полагается SwiftUI.

Свойство @Published также совсем не похоже на AnyPublisher. @Published всегда имеет Never в качестве типа сбоя, AnyPublisher может иметь другие случаи сбоя.

@Published имеет ощущение состояния / текущего значения, что не относится к AnyPublisher. CurrentValueSubject подошел бы ближе всего, но это не сработало бы, потому что @Published можно использовать в качестве привязки, что невозможно для CurrentValueSubject. Важным отличием является то, что SwiftUI может назначать новые значения свойству @Published напрямую (isLoggedIn = true приведет к изменению здесь).

Чтобы работать с издателями в SwiftUI, вам необходимо назначить их значения выделенное @Published свойство, как вы упомянули в исходном вопросе.

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

пример использования пользовательских наблюдений

import SwiftUI
import Combine

class Model: ObservableObject {
    @Published var flag = false
}


struct ContentView: View {
    @ObservedObject var model: Model
    let handle: AnyCancellable?
    init() {
        let m = Model()
        handle = m.$flag.sink(receiveValue: { (b) in
            print("model flag changed to:", b)
        })
        model = m
    }
    var body: some View {
        Toggle(isOn: $model.flag) {
            Text("Toggle")
        }.padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

из SwiftUI. Просмотр издателя доступен как

$model.$flag

, если необходимо.

...