學(xué)習(xí)NSNotification的時(shí)候在網(wǎng)上找了很多資料都不是很滿意暖混,對(duì)于初學(xué)者來(lái)說(shuō)很亂,這里我會(huì)給出最簡(jiǎn)單的解釋
場(chǎng)景:
假設(shè)有兩個(gè)人A,B 他們都想找iOS的工作,所以他們兩個(gè)就都關(guān)注了一個(gè)公告欄,這個(gè)公告欄會(huì)發(fā)布iOS招聘信息
監(jiān)聽(tīng)通知
現(xiàn)在A,B兩個(gè)人準(zhǔn)備關(guān)注公告欄,這個(gè)公告欄就是
[NSNotificationCenter defaultCenter]
這個(gè)是通知中心,采用單例模式栅贴,也就是說(shuō),整個(gè)程序的運(yùn)行期間熏迹,這個(gè)對(duì)象都只會(huì)有一個(gè)檐薯,而且在任何類中都能訪問(wèn)到
現(xiàn)在準(zhǔn)備監(jiān)聽(tīng):
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivenotification:) name:@"iOS" object:nil];
-
addObserver
: 也就是觀察者是誰(shuí),這個(gè)地方就是A自己 -
selector
: 當(dāng)收到通知的時(shí)候(觸發(fā)),調(diào)用參數(shù)中的方法 -
name
:消息的名稱 -
object
:誰(shuí)發(fā)來(lái)的消息(暫時(shí)不用理解)
現(xiàn)在通俗的解釋就是注暗,A這個(gè)人關(guān)注了公告欄上面的消息坛缕,消息的名稱是iOS
,也就是說(shuō)一旦公告欄上有iOS
這則消息的時(shí)候友存,A就會(huì)收到這則通知并且調(diào)用相應(yīng)的方法
從上面我們可以知道祷膳,name
這個(gè)參數(shù)其實(shí)是方便消息的區(qū)分的
調(diào)用的函數(shù):
-(void)receivenotification:(NSNotification*)noti{
NSLog(@"%@收到消息,消息是%@",self,noti.userInfo);
}
發(fā)布通知
現(xiàn)在有個(gè)公司準(zhǔn)備在公告欄上發(fā)布iOS的招聘信息了,在這里假設(shè)認(rèn)定這個(gè)公司就是ViewController
[[NSNotificationCenter defaultCenter] postNotificationName:@"iOS" object:self userInfo:@{@"recruit":@"iOS engineer"}];
現(xiàn)在這個(gè)公司就已經(jīng)在公告欄上發(fā)布了一個(gè)通知,
-
postNotificationName
:通知名稱 -
object
:發(fā)送通知的對(duì)象 -
userInfo
:通知攜帶的信息
一旦這個(gè)通知被發(fā)布出去屡立,那么只要關(guān)注了公告欄上叫做iOS
通知的對(duì)象都會(huì)被告知直晨,調(diào)用相應(yīng)的方法
從上我們能看出搀军,Notification機(jī)制是一對(duì)多的
對(duì)于參數(shù)object的理解
在前面我們?cè)O(shè)置關(guān)注的object
為nil
,那就意味著只要是消息名稱叫做iOS
的我們都會(huì)被告知,現(xiàn)在假設(shè)A想要專門(mén)關(guān)注騰訊公司的關(guān)于iOS
的通知勇皇,那么這個(gè)obejct就要設(shè)置成為騰訊
注意的是,obejct要是完全相等的才行罩句,是同一個(gè)對(duì)象,而不是同一個(gè)類
基本上NSNotification就是這么個(gè)意思了