2017-01-07 5 views
1

最近ReSwift APIを使用しましたが、ReSwiftRecorderも追加します。 ReSwiftRecorder in Githubのサンプルは非常に簡単です。ReSwiftRecorderプロパティを持つアクションを追加する

私はもっと複雑なものが必要です。私はサーバーからデータを取得するオブジェクトを持っており、アプリケーションがネットに接続されていないときにデータをリロードする必要があります。ここに私のコードは次のとおりです。

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) 
    } 

} 

が、私はすべて保存されたプロパティを初期化せずに初期化する機能に初期化子から

戻るエラーを得た

I初期化コードを設定すると、エラーは消えますが、アプリケーションは保存されたデータを復元しません!どうすれば修正できますか?

答えて

1

シリアル化/逆シリアル化コードを追加することをお勧めします。 menusプロパティを設定する必要があります。また、あなたは​​としてそのプロパティをシリアル化することになるでしょう:

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の一部であることが少し疑わしいです。 ChangeMenusAction(result:)などの代わりにSettingMenusFailedActionのようなアクションをディスパッチする前に、それを減らすか処理することを期待していました。 sidenoteと同じように、アクションは型付きのプロパティ設定ツール以上のものでなければなりません。

+0

お返事ありがとうございます。 –

関連する問題