Hi, I have this weird issue where if UIViewController listens to value via store.publisher
it differs from value if access it directly from store
Here's the issue:
viewStore.publisher.sessions
.sink { [weak self] sessions in
if sessions.count != self!.viewStore.sessions.count {
// This gets called sometimes, why and how to solve it?
}
}
.store(in: &cancellables)
My issue, that based on new sessions I need to reload tableView, but since sometimes viewStore.sessions
differs from latest version, I don't get desired effect.
I am really new with Combine and Composable Architecture, it might be I am doing something silly, so here's small snippet:
func showSessions() {
let env = Environment(mainQueue: .main,
fetchSessions: {
UserData.sharedData.sessions
.getAll() // returns Future<[Session], Never>
.eraseToEffect()
})
let viewController = SessionVC(store: Store(initialState: SessoinState(),
reducer: sessionReducer,
environment: env))
navigationController?.pushViewController(lakeBokVC, animated: true)
}
struct SessionState: Equatable {
var sessions: [SonarSession] = []
}
enum SessionAction: Equatable {
case viewDidLoad
case fetchedSessions(Result<[SonarSession], Never>)
}
struct Environment {
var mainQueue: AnySchedulerOf<DispatchQueue>
var fetchSessions: () -> Effect<[SonarSession], Never>
}
let lakeBookReducer = Reducer<SessionState, SessionAction, Environment> { state, action, environment in
switch action {
case .viewDidLoad:
return environment.fetchSessions()
.receive(on: environment.mainQueue)
.catchToEffect()
.map(SessionAction.fetchedSessions)
case let .fetchedSessions(.success(sessions)):
state.sessions = sessions
return .none
}
}
final class SessionVC: UIViewController {
(...)
override func viewDidLoad() {
super.viewDidLoad()
viewStore.publisher.sessions
.sink { [weak self] sessions in
if sessions.count != self!.viewStore.sessions.count {
// This gets called sometimes, why and how to solve it?
}
}
.store(in: &cancellables)
}
}