iOS 常用设计模式

目录

  • 观察者 (NSNotification)
  • 委托模式 (Delegate)
  • 单例 (Single)
  • MVC
一、观察者 (NSNotification)

观察者设计模式就像微信公众号一样,你关注了一个公众号,才能收到公众号发的消息,所以说addObserver注册消息通知是前提,只有先注册消息通知,才能收到相应post的消息。

// 注册一个登陆成功的通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loginSucceed) name:NFLoginSucceedNotification object:nil];

注册完这个通知后,不管你是账号登录,还是注册完直接登录,还是第三方登录成功的时候,都可以post一个登陆成功的通知。

// 登录成功的通知
[[NSNotificationCenter defaultCenter]postNotificationName:NFLoginSucceedNotification object:nil];

通知使用起来比较简单就不多介绍了,以下是通知的几点说明:

  1. 通知的名字尽量使用常量字符串
// 登录成功
UIKIT_EXTERN NSString *const NFLoginSucceedNotification;
  1. 通知的执行顺序,是按照post的顺序执行的,并且是同步操作的,即如果你在程序中的A位置post了一个NSNotification,在B位置注册了一个observer,通知发出后,必须等到B位置的通知回调执行完以后才能返回到A处继续往下执行,所以不能滥用通知。
  2. 善于用系统提供给我们的通知,比如:
UIKIT_EXTERN NSNotificationName const UIKeyboardWillShowNotification __TVOS_PROHIBITED;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidShowNotification __TVOS_PROHIBITED;
UIKIT_EXTERN NSNotificationName const UIKeyboardWillHideNotification __TVOS_PROHIBITED;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidHideNotification __TVOS_PROHIBITED;

4.通知发出后,controller不能从观察者获得任何的反馈信息,这也通知和委托模式 (Delegate)的一个区别吧。

5.NSNotification与多线程问题,在多线程应用中,Notification在哪个线程中post,就在哪个线程中被转发,而不一定是在注册观察者的那个线程中。也就是说,Notification的发送与接收处理都是在同一个线程中。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"addObserver notification thread = %@",[NSThread currentThread]);
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification) name:HandleNotificationName object: nil];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       
        [[NSNotificationCenter defaultCenter] postNotificationName:HandleNotificationName object:nil];

        NSLog(@"post notification thread = %@",[NSThread currentThread]);
    });
}

- (void)handleNotification
{
    NSLog(@"handle notification thread = %@",[NSThread currentThread]);
}

其打印结果如下:

addObserver notification thread = <NSThread: 0x60000007be00>{number = 1, name = main}
handle notification thread = <NSThread: 0x600000267200>{number = 3, name = (null)}
post notification thread = <NSThread: 0x600000267200>{number = 3, name = (null)}
二、代理 (Delegate)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式 单例模式作为一种目标明确、结构简单、理解容易的设计模式,在软件开发中使用频率相当高,在很多应用软件和框架...
    miliPolo阅读 4,260评论 0 5
  • 单例模式 单例模式作为一种目标明确、结构简单、理解容易的设计模式,在软件开发中使用频率相当高,在很多应用软件和框架...
    语安月月鸟阅读 3,146评论 0 1
  • 在软件开发中,无论是那种高级语言中总会伴随着一些最为常用的设计模式,下面针对iOS中,MVC模式、代理模式、观察者...
    Swift社区阅读 9,946评论 0 11
  • 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知...
    莫离_焱阅读 11,590评论 1 8
  • 1.为什么学习设计模式 对于设计模式,我们并不陌生。一谈起设计模式,脑海里马上就想到单例模式,委托模式,观察者模式...
    coder小鹏阅读 9,431评论 13 16