iOS通知拾遺

2021-08-13 11:16:14 字數 4187 閱讀 5726

如下的例子,傳送乙個通知,在控制台輸出一些資訊

- (void)sendnofition

- (void)handlenotification:(nsnotification*)notification

控制台輸出順序如下:

1.傳送通知:

2.處理通知:

3.傳送通知結束

上面的輸出順序表示其是乙個同步的通知

如下的非同步通知:

- (void)notificationqueue
控制台輸出順序為:

1.傳送通知:

3.傳送通知結束

2.處理通知:

方法

- (void)enqueuenotification:(nsnotification *)notification postingstyle:(nspostingstyle)postingstyle coalescemask:(nsnotificationcoalescing)coalescemask formodes:(nullable nsarray*)modes;
方法說明:使用指定的posting樣式,聚合條件和runloop模式,將notification新增到notification佇列中

coalescemask-將通知屬性與佇列中通知的屬性進行匹配時指示使用什麼標準的mask。通過組合任何nsnotificationnocoalescingnsnotificationcoalescingonnamensnotificationcoalescingonsender建立mask

modes-只有runloop是modes陣列中提供的模式時,通知佇列才將通知post到通知中心

如果在乙個新的執行緒中來呼叫傳送通知的方法,會有什麼樣的效果呢?

1.傳送同步通知

[nsthread detachnewthreadselector:@selector(sendnofition) totarget:self withobject:nil];
detachnewthreadselector:totarget:withobject:方法參考ios多執行緒之nsthread

控制台輸出為:

1.傳送通知:

2.處理通知:

3.傳送通知結束

可見通知在子執行緒中被傳送,也在子執行緒中被處理

2.傳送非同步通知

[nsthread detachnewthreadselector:@selector(notificationqueue) totarget:self withobject:nil];
此時控制台輸出結果為:

1.傳送通知:

3.傳送通知結束

可見非同步通知在子執行緒中發出,但是並沒有被處理

如果此時把nspostwhenidle修改為nspostnow,表示馬上post,再次呼叫

[nsthread detachnewthreadselector:@selector(notificationqueue) totarget:self withobject:nil];

......

- (void)notificationqueue

此時輸出結果為:

1.傳送通知:

2.處理通知:

3.傳送通知結束

此時通知在子執行緒中被傳送,而且在子執行緒中被處理,可以理解nspostnow為同步

執行緒與通知的關係:每乙個執行緒都有乙個通知佇列,執行緒結束之後,則通知佇列也被釋放

現在使執行緒不結束,是什麼狀況呢?

[nsthread detachnewthreadselector:@selector(notificationqueue) totarget:self withobject:nil];
- (void)notificationqueue
此時控制條輸出為:

1.傳送通知:

3.傳送通知結束

2.處理通知:

可以看出,通知在子執行緒中被傳送,也在子執行緒中被處理

如果再建立乙個通知,即現在有2個通知

- (void)notificationqueue
控制台輸出為:

1.傳送通知:

3.傳送通知結束

2.處理通知:

2.處理通知:

如果將nsnotificationnocoalescing修改為nsnotificationcoalescingonname,表示按名字合併

[notificationqueue enqueuenotification:notifione postingstyle:nspostwhenidle coalescemask:nsnotificationcoalescingonname formodes:nil];

[notificationqueue enqueuenotification:notifitwo postingstyle:nspostwhenidle coalescemask:nsnotificationcoalescingonname formodes:nil];

此時,控制台輸出為:

1.傳送通知:

3.傳送通知結束

2.處理通知:

可見處理通知只有乙個,已合併

但此時如果將nspostwhenidle修改為nspostnow,表示乙個同步通知

[notificationqueue enqueuenotification:notifione postingstyle:nspostnow coalescemask:nsnotificationcoalescingonname formodes:nil];

[notificationqueue enqueuenotification:notifitwo postingstyle:nspostnow coalescemask:nsnotificationcoalescingonname formodes:nil];

此時控制台輸出為:

1.傳送通知:

2.處理通知:

2.處理通知:

3.傳送通知結束

此時通知並沒有被合併,處理了2次

但其實上面的通知並不是乙個真正的非同步通知,我們希望的是,在乙個執行緒中傳送通知,而在另乙個執行緒中處理通知

這裡使用nsport,把port新增到哪個執行緒中,就在哪個執行緒中進行處理

_port = [[nsport alloc] init];

_port.delegate = self;

[[nsrunloop currentrunloop] addport:_port formode:nsrunloopcommonmodes];

// 傳送訊息

- (void)sendport

//處理訊息

- (void)handleportmessage:(nsportmessage *)message

傳送通知

[nsthread detachnewthreadselector:@selector(sendport) totarget:self withobject:nil];
此時控制台輸出為:

傳送執行緒1: thread:

傳送結束3

處理任務執行緒2:

1212

可見在子執行緒傳送通知,在主線程處理通知

asp知識拾遺

最近做的乙個小 碰到了許多問題,能解決的都解決了,還有的沒辦法就找了替代的解決辦法.下面收集一下 1 在選擇了一系列的checkbox後的提交表單提交後,會獲取到name1,逗號,空格,name2,逗號,空格,結果,系統需要獲取這些值,我用了以下 實現.uname request.form user...

Linux同步拾遺

一般情況下,執行緒在主題函式退出的時候會自動終止,但同時也可以因為接收到另乙個執行緒發來的終止請求而強制終止。執行緒取消的方法是向目標執行緒發cancel訊號,但如何處理cancel訊號則由目標執行緒自己決定,或者忽略,或者立即終止,或者繼續執行到cancelation point 取消點 由不同c...

面試拾遺 1

本文用來把我面試時遇到的沒有弄明白的問題記錄下來。一 資料庫的normalization與denormalization normalization的目的之一是減少冗餘的過程,之二是方便資料庫查詢語言的使用。什麼叫做方便資料庫查詢語言的使用呢?也就是消除update,insertion及deleti...