美文网首页iOS-swiftSwift开发swift
iOS开发第三方库一 ReSwift

iOS开发第三方库一 ReSwift

作者: 豆志昂扬 | 来源:发表于2017-12-08 13:16 被阅读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通过三大组件实现了数据流的单向流动。

    • State: 保存应用所在状态, 且状态的变更只能在Store 中进行, 当在状态变更时,Store会通知所有的观察者。
    • Action:不包含任何业务代码,Store会接受action并将其传递给Reducer,而Reducer会根据不同的action创建新的State。
    • Reducer:根据当前应用state和当前action,并创建新的应用状态。

    我们来通过一个加减法的计数器例子来看看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层如何使用上面定义的三组件:

    • 注册监听Store中State的变化。
    • 触发Action事件,试图改变State。
    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 常见架构一览》

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

    • 直接添加公众号豆志昂扬
    • 微信扫描下图二维码;

    相关文章

      网友评论

      • RayTeng:请问ReSwift的性能如何?对比NSNotification。

      本文标题:iOS开发第三方库一 ReSwift

      本文链接:https://www.haomeiwen.com/subject/dlzhixtx.html