通知与推送

2020-05-27  本文已影响0人  飞哥漂流记

$\color{red}{ 通知 ?}$

通知:

使用观察者模式来实现的用于跨层传递消息的机制

关键类结构:

NSNotification:

@property(readonly,copy)NSNotificationName name;// 通知名称,通知的唯一标识@property(nullable,readonly,retain)id object;// 任意对象,通常是通知发送者@property(nullable,readonly,copy)NSDictionary*userInfo;// 通知的附加信息

NSNotificationCenter:

这是个单例类,负责管理通知的创建和发送,属于最核心的类了。而NSNotificationCenter类主要负责三件事

添加通知

发送通知

移除通知

// 添加通知观察者

- (void)addObserver:(id)observer selector:(SEL)aSelector

name:(nullable NSNotificationName)aName

object:(nullable id)anObject;

- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name

object:(nullable id)obj

queue:(nullable NSOperationQueue *)queue

usingBlock:(void (^)(NSNotification *note))block;

// 发出通知

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

- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;

- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

// 移除通知观察者

- (void)removeObserver:(id)observer;

- (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject;

若notificationName为nil,通知中心会通知所有与该通知中object相匹配的监听对象。

若anObject为nil,通知中心会通知所有与该通知中notificationName相匹配的监听对象。

iOS9以后NSNofitifcationCenter无需手动移除观察者


面试题:

通知的发送时同步的,还是异步的?

同步

NSNotificationCenter接受消息和发送消息是在一个线程里吗?如何发送异步消息?

通知的接收和发送是在一个线程里

实际上发送通知都是同步的,不存在异步操作。而所谓的异步发送,也就是延迟发送,在合适的实际发送。

实现异步发送:

让通知的执行方法异步执行即可

通过NSNotificationQueue,将通知添加到队列当中,立即将控制权返回给调用者,在合适的时机发送通知,从而不会阻塞当前的调用

页面销毁时不移除通知会崩溃吗?

iOS9.0之前,会crash,原因:通知中心对观察者的引用是unsafe_unretained,导致当观察者释放的时候,观察者的指针值并不为nil,出现野指针。

iOS9.0之后,不会crash,原因:通知中心对观察者的引用是weak。

多次添加同一个通知会是什么结果?

多次添加同一个通知,会导致发送一次这个通知的时候,响应多次通知回调。

多次移除通知呢?

多次移除通知不会产生crash

下面的方式能接收到通知吗?为什么?

// 发送通知

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

// 接收通知

[NSNotificationCenter.defaultCenter postNotificationName:@"TestNotification" object:nil];

不能

当添加通知监听的时候,我们传入了name和object,所以,观察者的存储链表是这样的:

named表:key(name):value->key(object):value(Observation)

因此在发送通知的时候,如果只传入name而并没有传入object,是找不到Observation的,也就不能执行观察者回调

5. 服务器是否知道APNS推送后有没有到达客户端的方法?

APNS是苹果提供的远程推送的服务,APP开发此功能之后,用户允许推送之后,服务端可以向安装了此app的用户推送信息。但是APNS推送无法保证100%到达。

目前关于APNS苹果更新了新的策略,即 APNS/HTTP2.

如果服务器像APNS服务器推送信息之后,服务器能够接收到APNS是否真的成功像客户端推送成功了某个信息。这样在一定程度上提高了APNS的成功概率

APNS推送失败时,response将返回Json格式的失败信息。

6. APNS的原理?

远程通知 Remote notifications(也称为推送通知)允许我们将少量数据推送到安装了应用程序的设备,即使应用程序未运行也是如此。应用使用通知来通知用户。

远程通知从公司的服务器开始。我们决定何时向用户发送通知。在发送通知时,我们将生成包含通知数据和用户设备的唯一标识符的请求。然后将请求转发给APNs,APNs处理将通知传递给用户的设备。收到通知后,用户设备上的操作系统会处理任何用户交互并将通知发送到应用程序

APNs 必须先知道用户设备的地址,然后才能向该设备发送通知。此地址采用设备令牌的形式,该设备令牌对于设备和应用程序都是唯一的。在启动时,应用程序 与 APNs 通信并接收其设备令牌,然后应用程序将其转发到提供商服务器

7. NSNotificationCenter通知中心的实现原理?

8. 对象添加到通知中心中,当通知中心发通知时,这个对象却已经被释放了,可能会出现什么问题?

通知是多对多的关系,主要使用场景是跨模块传值。当某对象加入到通知中心后,若在对象被销毁前不将该对象从通知中心中移除,当发送通知时,就会造成崩溃。这是很常见的。所以,在添加到通知中心后,一定要在释放前移除

答案和其他问题待更新!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

上一篇下一篇

猜你喜欢

热点阅读