最近我使用过ReSwift API,我也想添加ReSwiftRecorder! ReSwiftRecorder in Github的示例是非常简单的应用
我需要更复杂的事情。我有一个从服务器获取数据的对象,我需要它在应用程序未连接到网络时重新加载其数据。这是我的代码:
届时AppState:
struct AppState: StateType {
var menus: Result<[Menu]>?
}
MenuReducer:
func menusReducer(state: Result<[Menu]>?, action: Action) -> Result<[Menu]>? {
switch action {
case let action as SetMenusAction:
return action.menus
default:
return state
}
}
AppReducer:
struct AppReducer: Reducer {
func handleAction(action: Action, state: AppState?) -> AppState {
return AppState(
menus: menusReducer(state: state?.menus, action: action),
)
}
}
MenuActions:
struct SetMenus: Action {
let menus: Result<[Menu]>
}
我知道我需要将MenuAction更改为这样的东西:
let SetMenusActionTypeMap: TypeMap = [SetMenusAction.type: SetMenusAction.self]
struct SetMenusAction: StandardActionConvertible {
static let type = "SET_MENU_ACTION"
let menus: Result<[Menu]>
init() {}
init(_ standardAction: StandardAction) {}
func toStandardAction() -> StandardAction {
return StandardAction(type: SetMenusAction.type, payload: [:], isTypedAction: true)
}
}
但我在init函数上出错了
从初始化程序返回,而不初始化所有存储的属性
当我设置初始化代码时,错误消失,但应用程序无法恢复已保存的数据!我该如何解决?
答案 0 :(得分:1)
您需要添加序列化/反序列化代码。需要设置menus
属性。此外,您还希望将该属性序列化为payload
:
let SetMenusActionTypeMap: TypeMap = [SetMenusAction.type: SetMenusAction.self]
struct SetMenusAction: StandardActionConvertible {
static let type = "SET_MENU_ACTION"
let menus: Result<[Menu]>
init() {
self.menus = // however you initialize that
}
init(_ standardAction: StandardAction) {
let maybeMenus = standardAction.payload["menus"] as? [Menu]?
self.menus = // create Result from Optional<[Menu]>
}
func toStandardAction() -> StandardAction {
let maybeMenus = self.menus.asOptional // Cannot serialize Result itself
return StandardAction(type: SetMenusAction.type, payload: ["menus" : maybeMenus], isTypedAction: true)
}
}
所以我在这里看到的问题:JSON序列化依赖于有效载荷数据的字典表示,即对象的属性。结果可以直接序列化吗?我猜不是,所以你需要转换它,可能最容易为零。
总而言之,有效载荷是您错过的关键,现在您必须弄清楚如何将它与您手头的数据一起使用。此外,我有点怀疑Result类型本身是AppState的一部分。我希望在发送行动之前减少或处理它,例如SettingMenusFailedAction
而不是ChangeMenusAction(result:)
或类似行为。正如旁注:行动应该不仅仅是打字的财产制定者。