首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift中Notification.Name这么难用怎么办

以前的发送通知的参数就是一个简单的字符串:

NSNotificationCenter.defaultCenter().post("someStringThatShouldBeDeclared")

后来到了swift 3 中,改成了Notification.Name。定义在Notification的命名空间下,是一个结构体,初始化函数接收一个字符串。

extension NSNotification {

  public struct Name : RawRepresentable, Equatable, Hashable, Comparable {

      public init(_ rawValue: String)

      public init(rawValue: String)

  }

}

用起来就麻烦了一点:

NotificationCenter.default.post(Notification.Name(rawValue: "MyNotificationName"))

如果还是按照以前的方式定义一个全局字符串常量就没有好好领会Swift精神了。

至少需要这样,通过extension声明一个静态的常量:

extension Notification.Name {

  static let AccountBalanceUpdated = Notification.Name("accountBalanceUpdated")

}

// invocation

NotificationCenter.default.post(.AccountBalanceUpdated)

但是这种方式有一个小缺点,自定义的通知和系统的混在了一起,有时找起来比较尴尬。

这里其实也有另外一个问题,这种方式不能避免通知的名字重复。虽然如果命名规范不会有这样的问题,但是到底是个潜在的风险。

如果把上面两个问题合起来看,就有了另外一种方式:利用Enum。

先声明一个rawValue为字符串的枚举。为了规避命名的冲突,声明一个计算属性,在每个值的rawValue前插入一个字符串。再用这个字符串去生成NSNotification.Name:

enum CPNotification: String {

  case userLogout

  case userLogin

  var stringValue: String {

      return "CP" + rawValue

  }

  var notificationName: NSNotification.Name {

      return NSNotification.Name(stringValue)

  }

}

用起来就简单了,自己写一个扩展方法:

extension NotificationCenter {

  static func post(customeNotification name: CPNotification, object: Any? = nil){

      NotificationCenter.default.post(name: name.notificationName, object: object)

  }

}

这样在使用时,直接点出来的就都是自定义的通知了。

当然在通知处理的地方也写个扩展方法用起来就更爽了,比如我用Rx所以这样写:

extension Reactive where Base: NotificationCenter {

  func notification(custom name: CPNotification, object: AnyObject? = nil) -> Observable {

     return notification(name.notificationName, object: object)

  }

}

用起来就是这样:

     // 发送通知

      NotificationCenter.post(customeNotification: .userLogout)

    // 接收通知

     let _ = NotificationCenter.default.rx.notification(custom: .userLogout).subscribe(onNext: { (value) in

          CPNetworkConfig.userID = nil

      })

欢迎在社交网络上关注我:

推特:@庆春路卓富贵

微博:@没故事的卓同学

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180304B081BD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券