iOS 常用設(shè)計(jì)模式

目錄

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

觀察者設(shè)計(jì)模式就像微信公眾號一樣,你關(guān)注了一個公眾號,才能收到公眾號發(fā)的消息,所以說addObserver注冊消息通知是前提,只有先注冊消息通知,才能收到相應(yīng)post的消息。

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

注冊完這個通知后,不管你是賬號登錄,還是注冊完直接登錄,還是第三方登錄成功的時候,都可以post一個登陸成功的通知。

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

通知使用起來比較簡單就不多介紹了,以下是通知的幾點(diǎn)說明:

  1. 通知的名字盡量使用常量字符串
// 登錄成功
UIKIT_EXTERN NSString *const NFLoginSucceedNotification;
  1. 通知的執(zhí)行順序,是按照post的順序執(zhí)行的,并且是同步操作的,即如果你在程序中的A位置post了一個NSNotification,在B位置注冊了一個observer,通知發(fā)出后,必須等到B位置的通知回調(diào)執(zhí)行完以后才能返回到A處繼續(xù)往下執(zhí)行,所以不能濫用通知。
  2. 善于用系統(tǒng)提供給我們的通知,比如:
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.通知發(fā)出后,controller不能從觀察者獲得任何的反饋信息,這也通知和委托模式 (Delegate)的一個區(qū)別吧。

5.NSNotification與多線程問題,在多線程應(yīng)用中,Notification在哪個線程中post,就在哪個線程中被轉(zhuǎn)發(fā),而不一定是在注冊觀察者的那個線程中。也就是說,Notification的發(fā)送與接收處理都是在同一個線程中。

- (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]);
}

其打印結(jié)果如下:

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例模式 單例模式作為一種目標(biāo)明確、結(jié)構(gòu)簡單、理解容易的設(shè)計(jì)模式,在軟件開發(fā)中使用頻率相當(dāng)高,在很多應(yīng)用軟件和框架...
    miliPolo閱讀 909評論 0 5
  • 單例模式 單例模式作為一種目標(biāo)明確、結(jié)構(gòu)簡單、理解容易的設(shè)計(jì)模式,在軟件開發(fā)中使用頻率相當(dāng)高,在很多應(yīng)用軟件和框架...
    語安月月鳥閱讀 495評論 0 1
  • 在軟件開發(fā)中,無論是那種高級語言中總會伴隨著一些最為常用的設(shè)計(jì)模式,下面針對iOS中,MVC模式、代理模式、觀察者...
    Swift社區(qū)閱讀 4,619評論 0 11
  • 概述 在多數(shù)移動應(yīng)用中任何時候都只能有一個應(yīng)用程序處于活躍狀態(tài),如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,719評論 1 8
  • 1.為什么學(xué)習(xí)設(shè)計(jì)模式 對于設(shè)計(jì)模式,我們并不陌生。一談起設(shè)計(jì)模式,腦海里馬上就想到單例模式,委托模式,觀察者模式...
    coder小鵬閱讀 4,109評論 13 16

友情鏈接更多精彩內(nèi)容