nalexn / clean-architecture-swiftui

SwiftUI sample app using Clean Architecture. Examples of working with CoreData persistence, networking, dependency injection, unit testing, and more.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

dochoi-bot opened this issue · comments

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

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

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