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: why `case .isLoading` is not called even we got `.isLoading` on didSet?

mitolog opened this issue · comments

Hi, thanks for sharing and committing such a great project.

While using your architecture, I found that the the scope below is not always called:

case .isLoading:
return AnyView(loadingView)

even though you did setIsLoading at below:

countryDetails.wrappedValue.setIsLoading(cancelBag: cancelBag)

Is this behavior intended?

What I'm expecting is that the loading view will be shown if you enter the view every time. But, it's not.


I've also checked actual value with

        @Published var details: Loadable<Country.Details> {
            willSet{
                print("willSet (\(details) -> \(newValue))")
            }
            didSet {
                print("didSet (\(oldValue) -> \(details))")
            }
        }

then I got

willSet (notRequested -> isLoading(last: nil, cancelBag: CountriesSwiftUI.CancelBag))
didSet (notRequested -> isLoading(last: nil, cancelBag: CountriesSwiftUI.CancelBag))
willSet (isLoading(last: nil, cancelBag: CountriesSwiftUI.CancelBag) -> loaded(CountriesSwiftUI.Country.Details(...)
didSet (isLoading(last: nil, cancelBag: CountriesSwiftUI.CancelBag) -> loaded(CountriesSwiftUI.Country.Details(...)

so I expected CountryDetails.swift#L29 to be run, but it's not.

It may be very basic behavior or just an overlook of me but I appreciate anyone's help.

As I looked definition of wrappedValue , I found notation below:

    /// When a mutable binding value changes, the new value is immediately
    /// available. However, updates to a view displaying the value happens
    /// asynchronously, so the view may not show the change immediately.
    public var wrappedValue: Value { get nonmutating set }

Is this the reason why?

p.s. If I set ensureTimeSpan before sinkToLoadable , then set time interval to 1.5 , it works as expected.