iOS-swiftSwift开发swift

iOS开发第三方库一 ReSwift

2017-12-08  本文已影响286人  豆志昂扬

Model-View-Controller (MVC) 对于iOS开发者来说不是一个完美的解决方案,常见的问题是太多的模块(如网络,业务和存储等)都被堆积在Controller中,对于页面包含多个状态的场景更为显著,如超过1000代码的Controller比比皆是,这是因为MVC架构没有提供状态管理的解决方案。

关于iOS 常见架构一览参见这里

对于基于MVC的复杂逻辑页面,我们需要手动地利用回调(callbacks),委托(delegations),KVO(Key-Value-Observation)和通知等方法传递消息,这样才能保证相关页面在最新状态,众所周知手动调用容易引入问题且不容易扩展。

手动传递状态的弊端还有代码的可读性降低,因为很多依赖会隐藏在Controller内部。另一个显而易见的是缺点是会带来代码的不一致性,因为每个工程师都有自己喜欢的传递状态的方式,当然这些问题可以通过代码规范或代码评审流程来避免,但同时成本也不可避免的增加,而通过良好的框架可以让开发者自发统一行为,避免少走弯路,这也是框架的美妙所在吧。

ReSwift就是为了解决类似问题而生的,通过约束状态传递方法,这样可以减少开发者犯错的空间,且程序的易读性大幅增强。

另外ReSwift具有跨平台属性,支持iOS, macOS 和 tvOS。

ReSwift通过三大组件实现了数据流的单向流动。

我们来通过一个加减法的计数器例子来看看Reswift如果工作的。
首先来定义应用的State, Action 和 Reducer:

//State
struct AppState: StateType {
    var counter: Int = 0
}

//Action
struct CounterActionIncrease: Action {}
struct CounterActionDecrease: Action {}

//Reducer
func counterReducer(action: Action, state: AppState?) -> AppState {
    var state = state ?? AppState()

    switch action {
    case _ as CounterActionIncrease:
        state.counter += 1
    case _ as CounterActionDecrease:
        state.counter -= 1
    default:
        break
    }

    return state
}

为了维护State和接受Action,我们还需要定义Store, Store可具有全局属性。

let mainStore = Store<AppState>(
    reducer: counterReducer,
    state: nil
)

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    [...]
}

最后就是在View层如何使用上面定义的三组件:

class CounterViewController: UIViewController, StoreSubscriber {

   @IBOutlet var counterLabel: UILabel!

   override func viewWillAppear(_ animated: Bool) {
       mainStore.subscribe(self)
   }

   override func viewWillDisappear(_ animated: Bool) {
       mainStore.unsubscribe(self)
   }

//如果状态发生变化,newState 方法会被自动调用。
   func newState(state: AppState) {
       counterLabel.text = "\(state.counter)"
   }

   @IBAction func increaseButtonTapped(_ sender: UIButton) {
       mainStore.dispatch(
           CounterActionIncrease()
       )
   }

   @IBAction func decreaseButtonTapped(_ sender: UIButton) {
       mainStore.dispatch(
           CounterActionDecrease()
       )
   }

}

完整的代码样例可点击这里下载。

更多

推荐阅读 《iOS 常见架构一览》

获取更多内容请关注微信公众号豆志昂扬:

上一篇 下一篇

猜你喜欢

热点阅读