nalexn / clean-architecture-swiftui

SwiftUI sample app using Clean Architecture. Examples of working with CoreData persistence, networking, dependency injection, unit testing, and more.
MIT License
5.57k stars 671 forks source link

Question: about your article of stranger-things-swiftui-state #43

Open dochoi-bot opened 3 years ago

dochoi-bot commented 3 years ago

Hi First of all, thank you I'm learning a lot about clean architecture for Swift UI from you

stranger-things-swiftui-state in the "Clean Architecture for SwiftUI" article, "Coordinator is history" Section In this scenario,

struct TestView: View {

    let publisher = PassthroughSubject<String, Never>()    // 1
    let publisher = CurrentValueSubject<String, Never>("") // 2

    var body: some View {
        MyView(publisher: publisher.eraseToAnyPublisher())
    }
}

Scenario 2 works differently.

Here's my code.

import SwiftUI

@main
struct TestSwiftUIApp: App {

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
import SwiftUI
import Combine

struct ContentView: View {
    let publisher = CurrentValueSubject<String, Never>("") // 2
    var body: some View {
        MyView(publisher: publisher.eraseToAnyPublisher())
    }

}

struct MyView: View {

    let publisher: AnyPublisher<String, Never>

    @State var text: String = ""
    @State var didAppear: Bool = false

    var body: some View {
        Text(text)
            .onAppear { self.didAppear = true }
            .onReceive(publisher) {
                print("onReceive")
                self.text = $0
            }
    }
}

image

my answer is 1...

also

struct MyView: View {

    let publisher: AnyPublisher<String, Never>

    @State var text: String = ""
    @State var didAppear: Bool = false

    var body: some View {
        Text(text)
            .onAppear { self.didAppear = true
                self.text = "abc"
            }
            .onReceive(publisher) {
                print("onReceive")
                self.text = $0
            }
    }
}

my answer is "abc"...

image

The result is different because of SwifttUI 2.0? or I'm missing something?

Thanks

nalexn commented 3 years ago

Possibly a SwiftUI 2.0 change. Could you try running this on iOS 13?

dochoi-bot commented 3 years ago

I just installed the 13.0 simulator. and built. Here's my code

import SwiftUI
import Combine

struct ContentView: View {
    let publisher = CurrentValueSubject<String, Never>("") // 2
    var body: some View {
        MyView(publisher: publisher.eraseToAnyPublisher())
    }

}

struct MyView: View {

    let publisher: AnyPublisher<String, Never>

    @State var text: String = ""
    @State var didAppear: Bool = false

    var body: some View {
        Text(text)
            .onAppear { self.didAppear = true
                self.text = "abc"
                print(UIDevice.current.systemVersion)
            }
            .onReceive(publisher) {
                print("onReceive")
                self.text = $0
            }
    }
}

image

Something seems to be updated