- ReSwift 向けに Redux Saga を再現したプロジェクトです
- 完全再現ではなく、設計思想を参考にしつつ、一部機能を再現しています
- Xcode 14.3.1
- iOS 13.0 以上をサポートしています
- 準備中
現在、下記の effect をサポートしています。
- put
- selector
- call
- fork
- take
- takeEvery
- takeLatest
- takeLeading
We requires ReSwift (~> 6.1.0).
Xcode から設定する、または Package.swift
の dependencies
を編集してください。
dependencies: [
.Package(url: "https://github.com/mitsuharu/ReSwift-Saga.git", upToNextMajor: "x.y.z")
]
not yet
- 詳しくは Example を見てください
- ReSwift 6.1.1 を利用しています。
- Store の生成時に
createSagaMiddleware
で生成した middleware を追加します。
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 は struct で生成します
- enum はサポートしていません
import ReSwift
protocol UserAction: Action {}
struct RequestUser: UserAction {
let userID: String
}
struct StoreUserName: UserAction {
let name: String
}
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))
}
- ViewModel での実装例です
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"))
}
}