通知详解

iOS通知详解 不同线程发出通知的处理

通知的基础知识

每一个应用程序都有一个通知中心,专门负责协助不同 对象之间的消息通信。

任何一个对象都可以向通知中心发布通知,描述自己在做什么。其他感兴趣的对象可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知。

/****************    Notifications    ****************/
//一个通知一般包含三个属性:
@property (readonly, copy) NSString *name;//通知名称
@property (nullable, readonly, retain) id object;//通知发布者(是谁要发布通知)

//一些额外的信息(通知发布者传递给通知接收者的信息内容)
@property (nullable, readonly, copy) NSDictionary *userInfo;
//初始化一个通知:(NSNotification)对象
 - (instancetype)initWithName:(NSNotificationName)name object:(nullable id)object userInfo:(nullable NSDictionary *)userInfo
 + (instancetype)notificationWithName:(NSString *)aName object:(nullable id)anObject;
 + (instancetype)notificationWithName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
/****************    Notification Center    ****************/

//发布通知方法(通知中心提供了相应的方法来帮助发布通知)
//1.发布一个notification通知,可在notification对象中设置通知的名称,通知发布者、额外的信息等

- (void)postNotification:(NSNotification *)notification; 

//2.发布一个名称为aName的通知,anObject为这个通知的发布者
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject;

//3.发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息(通知的内容)
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
/// 监听通知方法
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;

///使用block处理通知回调用 
// The return value is retained by the system, and should be held onto by the caller in
// order to remove the observer with removeObserver: later, to stop observation.
//Name: 通知的名称
//object:谁发出的通知
//queue: 队列,决定 block 在哪个线程中执行, nil  在发布通知的线程中执行
//usingBlock: 只要监听到通知,就会执行这个 block
- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));

//移除观察者
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject;

在通知中心注册过的对象,需要在该对象释放前移除监听。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用闪退.
执行顺序:一定要先向通知中心注册通知监听器,也就是谁要监听谁发布的消息,然后再执行发布消息,不然会导致消息发出来了没人接收的情况

同步或异步

[NotificationCenter defaultCenter] postNotification],这种方式是同步的,并且在哪个线程发,就在哪个线程收。
由于消息收和发都在同一个线程中。所以,尽量在主线程中post,不然会引起不必要的麻烦,ui刷新问题,崩溃问题等等
参考文档

addObserver调用多次

addObserver如果添加多次,当post的时候,也会收到多次。类似这种:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"TestNotification" object:nil];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"TestNotification" object:nil];

你可能不知道的Notification
iOS - Notification 通知
NSNotification


   转载规则


《通知详解》 志鹏 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
类初始化关键字 类初始化关键字
『Apple API』NS_UNAVAILABLE 与 NS_DESIGNATED_INITIALIZER当面对多个初始化方法时,外部调用者往往会手足无措,不知道哪一个才是正确的初始化方法,对此,苹果提供了两个关键字:NS_UNAVAILA
2018-11-16 志鹏
下一篇 
编写高质量代码的有效方法之(1-5)---OC基础 编写高质量代码的有效方法之(1-5)---OC基础
本部分主要了解OC的基础,总结几个比较高效的编程窍门 了解OC的起源 OC为C语言添加了面向对象特性,是其超集。OC使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收消息后,究竟应执行何种代码,由运行环境而非编译器决定。 OC
2018-11-09 志鹏
  目录