iOS细节知识收录iOS 收藏篇ios常用空间

iOS多线程中使用NSNotification

2017-05-07  本文已影响0人  cocoa_ziyue

NSNotification!对就是它,看着代码比较恶心,后期难以维护的一种回调传值模式——通知。(不能黑它,它也是苹果的一种常用的Api设计模式,它有它特定的使用场景,不再多说了,可以在AFNetWorking搜索下NSNotification,很多啊,有木有)

什么?它也有多线程使用的问题存在?notification 在多线程的情况下,线程的管理非常不好控制。这个怎么理解呢?

先看官方文档的解释:Regular notification centers deliver notifications on the thread in which the notification was posted. Distributed notification centers deliver notifications on the main thread. At times, you may require notifications to be delivered on a particular thread that is determined by you instead of the notification center. For example, if an object running in a background thread is listening for notifications from the user interface, such as a window closing, you would like to receive the notifications in the background thread instead of the main thread. In these cases, you must capture the notifications as they are delivered on the default thread and redirect them to the appropriate thread.

文档意思总结来说就是:NSNotification接受线程是基于发送消息的线程的,也就是要同步啦。如果你发送的消息不在主线程,接受消息就会自动在子线程中执行(不管你在主线程或者是子线程中注册消息)。那怎么办?在你收到消息通知的时候,注意选择你要执行的线程。如果在子线程中发送消息,则需要重定向到主线程中执行任务(比如刷新UI)。

话不多说,上代码。

在子线程中执行消息的情况。

注册和发送通知,其中发送通知在子线程

看打印,testNotify通知执行由于受在子线程中发通知的影响,也在子线程中执行。

打印结果

怎么办?

1.先说一个比较low的办法,在sendNotify函数中强制切到主线程,代码省略,大家应该都懂得。缺陷是每一个响应函数都强制切换线程。这样带来的问题就是每一处理响应通知的代码你都得这样做,对于开发者而言负担太大。

2.从定向到主线程执行。

apple 从 iOS4 之后提供了带有 block 的 NSNotification。使用方式如下:

-(id)addObserverForName:(NSString*)nameobject:(id)objqueue:(NSOperationQueue*)queue

用block的方法注册和执行通知

此时,看打印

此时block根据queue(main queue)的设置,在主线程中执行

我们通过这个采用block执行通知的新的注册通知的方法,只要设置[NSOperationQueuemainQueue],轻松实现在主线程中执行任务,so easy!大家可以大胆用起来。

上一篇下一篇

猜你喜欢

热点阅读