Alamofire源码之Notifications(附RAC拓展)

swift的通知中心Name变成了一个NSNotification下面的一个结构体,一般我们使用时,直接进行操作就行

NotificationCenter.default.post(name: NSNotification.Name("namechenge"), object: <#T##Any?#>, userInfo: <#T##[AnyHashable : Any]?#>)

但是,这种通过字符串去拼写进行多处使用时,容易拼写错误,这种情况我们最好使用枚举或者全局变量来避免这种bug的发生。之前我是直接按照系统的方式来进行拓展的

extension Notification.Name {
        static let DidResume = Notification.Name(rawValue: "org.alamofire.notification.name.task.didResume")
}

使用时是这样的
Notification.Name.DidResume

下面是Alamofire的拓展方式

extension Notification.Name {
    public struct Task {
        public static let DidResume = Notification.Name(rawValue: "org.alamofire.notification.name.task.didResume")
    }
}
使用时是这样的
Notification.Name.Task.DidResume

根据对比,使用Alamofire的方式时,我们很清楚Notification.Name是属于哪个类型下的,容易区分

~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~
下面是使用reactivecocoa框架时,我们可以更方便的使用通知中心,而且我们也不需要在deinit里面去remove观察者,因为rac里面已经进行了deinit处理

NotificationCenter.default.reactive.notifications(forName: Notification.Name.UIApplicationDidEnterBackground)
        .take(during: reactive.lifetime)
        .observeValues { noti in
            print(noti)
        }

有这种情况下虽然不需要我们在deinit移除对应的观察者,但是有时我们需要在viewWillAppear里面添加观察者,以及在viewDidDisappear里面移除观察者,这种情况就需要用到上面的函数的返回值Disposable.

var disposable: Disposable?
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        disposable = NotificationCenter.default.reactive.notifications(forName: Notification.Name.UIApplicationDidEnterBackground)
            .observeValues { noti in
                print(noti)
        }
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        disposable?.dispose()
        disposable = nil
    }

使用Disposable可以很方便的按照需求进行观察着的添加移除。

当然,我们可以写个NSObject的extension,可以让上面的这种代码更简洁

extension NSObject {
    @discardableResult
    func addObserve(for name: Notification.Name?, object sender: AnyObject? = nil, result: ((Notification) -> Void)?) -> Disposable? {
        return NotificationCenter.default.reactive.notifications(forName: name, object: sender)
        .take(during: reactive.lifetime)
        .observeValues({ noti in
            result?(noti)
      })
    }
    
    func post(for name: Notification.Name, info: [AnyHashable : Any]? = nil) {
        NotificationCenter.default.post(name: name, object: self, userInfo: info)
    }
}

你可能感兴趣的:(Alamofire源码之Notifications(附RAC拓展))