ios跨线程通知_iOS 通知的多线程处理 & 与Runloop的关系

本文详细介绍了iOS中通知的添加、移除方式,以及与线程和Runloop的关系。通过两种添加通知的方式展示了线程回调的不同,并通过实例探讨了通知在不同线程和Runloop状态下的执行顺序。同时,文章还讨论了如何在子线程中正确发送和接收通知,强调了子线程需常驻Runloop的重要性。
摘要由CSDN通过智能技术生成

一、通知的添加

通知的添加有两种常用的方式:

方式一:

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(receiceNotification:)

name:@"JKRNO"

object:nil];

addObserver:接收通知的对象

selector:接收通知的对象接收到通知调用的方法

name:通知的名字

object:接收哪个对象发送的通知

方式二:

@property (nonatomic, strong) NSObject *observer;

...

self.observer = [[NSNotificationCenter defaultCenter]

addObserverForName:@"JKRSEC"

object:self

queue:[NSOperationQueue new]

usingBlock:^(NSNotification * _Nonnull note) {

/// 接收到通知回调的block

}];

返回值:通知实际添加到的observer,移除通知要移除这个对象

name参数:通知的名字

object:接收哪个对象发送的通知

queue:接收到通知的回调在哪个线程中调用,如果传mainQueue则通知在主线程回调,否则在子线程回调

usingBlock:接收到通知回调的block

️方式一的声明方法,addObserver参数就是实际给哪个对象添加通知。而方式二方法,实际是给通知声明方法的返回值添加通知。

二、通知的移除

方式一

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;

方法声明的通知在iOS9.0之后是不用手动移除的,当被添加通知的对象销毁的时候,通知会自动被移除。

Description

如果在iOS9.0之前则还需要对被添加通知的销毁方法中移除通知:

- (void)dealloc {

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

方式二

- (id )addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);

通过这个方式添加的通知,是比较不一样的,首先它不会自动移除,其次,它的移除需要调用该方法返回的对象去移除,这就是为什么上面提到的这个添加方法的时候,会特别创建了一个属性来持有这个方法的返回参数。

@property (nonatomic, strong) NSObject *observer;

...

self.observer = [[NSNotificationCenter defaultCenter]

addObserverForName:@"JKRSEC"

object:nil queue:[NSOperationQueue new]

usingBlock:^(NSNotification * _Nonnull note) {

NSLog(@"%@", [NSThread currentThread]);

}];

...

- (void)dealloc {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值