ReSwift-Saga

开发

贡献

EFFECTS

当前支持以下 effect:

安装

需要 ReSwift (~> 6.1.0)。

Swift Package Manager

从 Xcode 进行设置,或者编辑 Package.swiftdependencies

dependencies: [
	.Package(url: "https://github.com/mitsuharu/ReSwift-Saga.git", upToNextMajor: "x.y.z")
]

CocoaPods

暂未支持

使用方法

Redux

func makeAppStore() -> Store<AppState> {
    
    // Saga 用の middleware を生成する
    let sagaMiddleware: Middleware<AppState> = createSagaMiddleware()
    
    let store = Store<AppState>(
        reducer: appReducer,
        state: AppState.initialState(),
        middleware: [sagaMiddleware]
    )
    return store
}

Action

import ReSwift

protocol UserAction: Action {}

struct RequestUser: UserAction {
    let userID: String
}

struct StoreUserName: UserAction {
    let name: String
}

Saga

let userSaga: Saga = { _ in
    await takeEvery(RequestUser.self, saga: requestUserSaga)
}

let requestUserSaga: Saga = { action async in
    guard let action = action as? RequestUser else {
        return
    }
    
    try? await Task.sleep(nanoseconds: 1_000_000_000)
    
    let name = "dummy-user-" + String( Int.random(in: 0..<100))
    try? await put(StoreUserName(name: name))
}

dispatch

import Foundation
import ReSwift

final class UserViewModel: ObservableObject, StoreSubscriber {
    @Published private(set) var name: String = ""

    init() {
        appStore.subscribe(self) {
            $0.select { selectUserName(store: $0) }
        }
    }

    deinit {
        appStore.unsubscribe(self)
    }

    internal func newState(state: String) {
        self.name = state
    }
    
    public func requestUser() {
        appStore.dispatch(RequestUser(userID: "1234"))
    }    
}