ReSwift - 在动画中间接收动作

时间:2016-10-11 03:32:39

标签: ios swift animation redux

我正在尝试使用ReSwift在我的iOS应用中应用Redux,但我仍然有一些未回答的Redux问题。

1)如何在动画中间处理接收状态更新? 例如:说某些状态发生了变化并触发了动画,然后我收到了另一个更新(由于来自互联网的一些数据同步)。如何处理这种情况?即延迟第二次更新直到动画结束。

2)我应该只发送改变状态的动作,还是只是为了触发动画而发送动作?例如:一个会触发一些动画的动作(比如滚动到UIScrollView中的某个位置)并不一定会改变任何状态(当然,我也有滚动位置的状态,但改变那个状态不会意味着动画到新的滚动位置,它可能意味着直接移动到它。我还在一个动作创建者中有条件地触发了这个动画,在另一个动作被调度并且其他一些状态被改变之后,所以我不能在View组件中这样做。

1 个答案:

答案 0 :(得分:1)

使用ReSwift进行状态和操作处理与Redux非常相似,但打字很强。

有两种主要类型的动画来处理周围的状态。并且很好地总结了你的两个问题。

  1. 设置为状态。状态更改 - 如您的示例所示 - 将任何有效状态的视图转换为新状态。如果现有动画正在进行中,您可以取消它们(如果可能,使用您正在进行的动画),或者排队下一个动画。

    大多数情况下,如果动画可以取消,请取消它们。如果是列表视图,则没有太多选择。如果要对动画进行排队,请在动画运行时忽略任何视图更改并更新最新状态的本地副本。然后确保任何动画触发完成块以比较动画之前和之后的状态,如果状态不同,则启动另一个动画。

  2. 第二部分听起来像你可以将它们视为触发动画。即登录失败,密码字段会震动一秒钟。

    其中一些可以通过将前一个字段值与当前值进行比较来处理,即从state.login_status.pending的{​​{1}}将触发动画开始。

    您不会收到原始操作流,只有.failed。这与Redux相同。即使对于可能不会影响州的事件,我鼓励使用操作。但是,你看到这些行动的唯一方法是通过中间件。创建一个过滤Action流的被动中间件对象,并将它们公开给ViewModel或ViewController。

  3. 我知道这听起来过于简单,但并没有太多。只需将Action流视为单一的事实来源,将状态视为流的投影,将视图视为状态的投影。开始时感觉有限,但很难出错。

    注意:

    • 目前暗示所有Reducers都将在主线程上运行,但它没有强制执行,并且由您决定是否从正确的线程完成调度。