1、Notifications(link)
--Design patterns for broadcasting information and for subscribing to broadcasts.
一种关于广播信息和订阅广播信息的设计模式
♦ NSKeyValueObserving(link) //这是协议
--An informal protocol that objects adopt to be notified of changes to the specified properties of other objects.
一种非正式协议,遵循这种协议的对象都可以接收到通知,这个通知是关于 指定的 某对象的 属性 发生变化时产生的通知,牛逼的是NSObject遵循了该协议,更牛逼的是,大多数的iOS的类都继承了NSObject,所以大概率下,iOS定义的类都可以接收通知,不是绝对。也有部分并未遵循该协议。实在不行,你自己扩展遵循便是了。这个协议里有很多声明方法啊。
关于观察者模式的编程指南:Key-Value Observing Programming Guide(link)
再看一个 象征通知信息 的结构体:
♦
struct Notification(link) //这是结构体
--A container for information broadcast through a notification center to all registered observers.
就是一个结构体,这个结构体是一个容器,容纳了各种可以用来广播出去的通知信息,广播的媒介NotificationCenter ,通知信息的接收人是所有已经注册了的观察者,观察者就是用上面的NSKeyValueObserving的方法来注册成观察者,作为谁的观察者,去观察谁这些,还要继续看NotificationCenter的方法。
例如
addObserver(_:selector:name:object:)
又或者 NSObject 中实现了 NSKeyValueObserving协议的observeValue(forKeyPath:of:change:context:)的方法,反正就有各种方式成为观察者,或者被观察
♦
class NotificationCenter //这是类
--A notification dispatch mechanism that enables the broadcast of information to registered observers.
没错,这就是通知信息的媒介,一种分发信息的机制。可以通过这个类,向所有的在册的观察者发送通知。每一个app都有一个default 的 notification center,你可以自定义,没什么事,默认的就够用了。但是每一个程序只能拥有一个notification center,所以你要跨程序传递通知的话,可以用来
DistributedNotificationCenter(link)
实现。介绍一些NotificationCenter 的方法:
•
func addObserver(Any, selector: Selector, name: NSNotification.Name?, object: Any?)
--Adds an entry to the notification center's dispatch table with an observer and a notification selector, and an optional notification name and sender.
将一个条目entry添加到 notification center 的分发表中,这个条目包括了观察者、通知选择器、通知名称、以及发送者,信息选择器其实就相当于c语言的函数指针,用来进行响应的操作的,然后通知的名称是指定该观察者观察这个通知,就是通知的标识。 一个对象可以多次调用次方法,多次指定自己作为观察者,自己观察自己。selector的参数,可以根据该方法的调用者进行推断。
•
func post(name: NSNotification.Name, object: Any?)
--Creates a notification with a given name and sender and posts it to the notification center.
把你定义的notification对象推进center中,轮到它的时候,center就会把它发布出去,然后那些注册了观察者的对象就会监听通知 ,监听到了,就会进行响应的操作。还有其他一些重载的post函数,逻辑是差不多的。
2、然后我也不知道怎么学了,那就阅读文档做笔记吧
官网里面有很多文档的超链接的,一个个地挖,慢慢的你就会越挖越多了。
目前计划路线:
Notification Programming Topics(link) —>
—> Key-Value Observing Programming Guide(link)—>
—> Threading Programming Guide (link) —>
—> Concurrency Programming Guide(link)—>
—> Core Bluetooth Programming Guide(link)
先看着再说。还有event要看
◍ 文档:Notification Programming Topics(link)
--These recipients of the notification, known as observers, can adjust their own appearance, behavior, and state in response
to the event. The object sending (or posting) the notification doesn’t have to know what those observers are.
notification 是一个封装通知的信息的对象,主要被设计用于通知事件的发生。你可以在你的代码中这样设计,当某事件发生时, 就发送一个notification,而这个notification会被observers接收,observer就会根据notification作出响应的行为。于是就相当于 observer响应了事件。没错,observer也是要你写代码注册的。具体又要看后面的notification center了。后面再说。
--When a notification is delivered to an interested observer, the notification object is passed in as an argument of the method handling the notification
★当center把notification传递给observer时,notification就作为处理该事件的函数的参数传进去,也就是selector的参数,可以根据类型推断。所以你定义的selector中要么参数就只有notification,要么就为空,反正notification都是要被默认传进去。
--The method must have the following signature:
- (void)myNotificationHandler:(NSNotification *)notif;
--In this handling method, you can extract information from the notification to help you in your response, especially data in the
userInfo
dictionary (if one exists).这是oc的,所以说swift的也一样,他会从你的selector方法中抽取出你的notification对象,从而获取相关信息,所以你定义响应事件的函数时,参数必须有且仅有一个notification,以便于center把notification传进去你的响应函数中,我说的。
▶ Notifications
--A message is the name of a method, and any parameters associated with it, that are sent to, and executed by, an object.
在OC中,message指的就是一个函数的名字,你send一个message给一个实例,就是你调用了该实例的该函数,换一个说法而已
--A notification encapsulates information about an event
一个notification就是压缩一些关于事件信息的通知对象。
--An
NSNotification
object (referred to as a notification) conta