如下的例子,傳送乙個通知,在控制台輸出一些資訊
- (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。通過組合任何nsnotificationnocoalescing
,nsnotificationcoalescingonname
和nsnotificationcoalescingonsender
建立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...