ReSwiftRecorder使用属性

时间:2017-01-07 09:59:23

标签: swift

最近我使用过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函数上出错了

  

从初始化程序返回,而不初始化所有存储的属性

当我设置初始化代码时,错误消失,但应用程序无法恢复已保存的数据!我该如何解决?

1 个答案:

答案 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:)或类似行为。正如旁注:行动应该不仅仅是打字的财产制定者。