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


    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)
        }  
    }

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

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

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

    extension Reactive where Base: NotificationCenter {
    extension NotificationCenter {
        static func post(customeNotification name: CPNotification, object: Any? = nil){
            NotificationCenter.default.post(name: name.notificationName, object: object)
        }
    }
      func notification(custom name: CPNotification, object: AnyObject? = nil) -> Observable<Notification> {
           return notification(name.notificationName, object: object)
        }
        
    }

    用起来就是这样:

     // 发送通知
            NotificationCenter.post(customeNotification: .userLogout)
        
          // 接收通知
           let _ = NotificationCenter.default.rx.notification(custom: .userLogout).subscribe(onNext: { (value) in
                CPNetworkConfig.userID = nil
            })
  • 相关阅读:
    [LeetCode]题解(python):094-Binary Tree Inorder Traversal
    [LeetCode]题解(python):093-Restore IP Addresses
    [LeetCode]题解(python):092-Reverse Linked List II
    [LeetCode]题解(python):091-Decode Ways
    第二阶段团队冲刺1
    进度总结报告十三
    梦断代码阅读笔记02
    第一阶段对各组的意见评价
    进度总结报告十二
    软件开发冲刺10
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/7587428.html
Copyright © 2020-2023  润新知