IMXEventBus
#功能列表:
- 以訂閱/發(fā)布的模式實(shí)現(xiàn)跨組件通信,也即通信模塊。類似
NSNotification的通信功能。 - 生命周期管理:注冊的事件訂閱者可自動(dòng)釋放,也可手動(dòng)管理其釋放時(shí)機(jī)。
- 優(yōu)先級(jí)處理:觸發(fā)事件時(shí),通過預(yù)設(shè)值的優(yōu)先級(jí),決定執(zhí)行訂閱者回調(diào)的先后順序。
- 訂閱者回調(diào)在主線程/非主線程執(zhí)行的控制。
- Debug模式下:增加輸出所有Event信息。
#如何使用:
1.)導(dǎo)入:
Cocoapods:pod 'IMXEventBus', '~> 1.0.0'
-
手動(dòng)導(dǎo)入:本庫無依賴其它三方庫,直接將
IMXEventBus文件夾拖入項(xiàng)目即可。
2.)頭文件引入:
#import "IMXEventBusKit.h"
3.)功能使用:
1. 注冊:
-
簡略模式:
//默認(rèn)值: //優(yōu)先級(jí):Default;回調(diào)執(zhí)行:非主線程 [IMXEventSubscriber addTarget:self name:@"login_eventName" action:^(IMXEventUserInfo *info) { NSLog(@"callback info:%@ thread:%@",[info description],[NSThread currentThread]); }]; -
全參模式:
[IMXEventSubscriber addTarget:self name:@"login_eventName" priority:IMXEventSubscriberPriorityDefault inMainTread:YES action:^(IMXEventUserInfo *info) { NSLog(@"callback info:%@ thread:%@",[info description],[NSThread currentThread]); }];
- 默認(rèn)情況下,優(yōu)先級(jí)是default,回調(diào)均是在非主線程下執(zhí)行。
2. 觸發(fā)事件:
-
簡略模式:
//默認(rèn)值: //被觸發(fā)的事件:不強(qiáng)制在主線程中執(zhí)行回調(diào) [IMXEventPoster postEventName:@"login_eventName" object:@{@"userName":@"demo"}]; -
全參模式:
[IMXEventPoster postEventName:@"login_eventName" object:nil forceMain:YES];
- 默認(rèn)情況下,firceMain:NO。即所有被觸發(fā)的監(jiān)聽對象,其回調(diào)執(zhí)行均參考自身屬性
isInMainThread;否則均強(qiáng)制在主線程執(zhí)行。
3. Debug:
-
功能匯總(僅在Debug模式下,log處理):
重復(fù)添加target對應(yīng)的同一事件時(shí),會(huì)打印或者彈出log提示。
-
post時(shí),無對應(yīng)的監(jiān)聽者存在,會(huì)打印或者彈出log提示。
- Debug模式下:輸出所有Event信息。(便于檢測當(dāng)前無訂閱者的僵尸事件以及未被觸發(fā)的事件)
注:僅輸出之前的Event調(diào)用情況,無法檢測輸出之后的log,故輸出的數(shù)目不代表最終數(shù)據(jù)。
-
開啟Debug功能:默認(rèn)不開啟。
[IMXEventDebug_share enableDebug:YES]; IMXEventDebug_share.debugType = IMXEventDebugTypeAlert;
- 無論如何設(shè)置,Debug功能僅在Debug模式下起作用。
#要點(diǎn)及圖譜:
- 注冊事件、觸發(fā)事件、移除事件等操作均針對同一隊(duì)列操作:所有操作均嵌入異步串行隊(duì)列之中,保證了資源存取的線程安全。
- 事件監(jiān)聽者對象分別由3個(gè)不同優(yōu)先級(jí)的NSMapTable隊(duì)列存儲(chǔ):以
Target:Model方式存儲(chǔ),對應(yīng)Target由于生命周期問題釋放后,那么事件隊(duì)列中相關(guān)條目會(huì)被自動(dòng)釋放。但無法實(shí)時(shí)檢測到,故發(fā)布事件時(shí)均需巡檢一次。 - 觸發(fā)事件時(shí):輪詢3個(gè)不同優(yōu)先級(jí)對類,執(zhí)行每個(gè)監(jiān)聽者對象的回調(diào):執(zhí)行操作均放在并行隊(duì)列中,并創(chuàng)建信號(hào)量控制線程的數(shù)量。且并行隊(duì)列嵌入在串行隊(duì)列中,保證3個(gè)對類按其優(yōu)先級(jí)順序執(zhí)行。
圖譜1:類圖結(jié)構(gòu)

圖譜2:事件注冊流程圖

圖譜3:事件觸發(fā)流程圖

#結(jié)構(gòu)描述:
一、數(shù)據(jù):
1. IMXEventSubscribModel:訂閱者對象
-
數(shù)據(jù)
- actionBlock:post觸發(fā)時(shí)執(zhí)行該回調(diào)
- priority:優(yōu)先級(jí),決定訂閱者對象預(yù)置入哪個(gè)隊(duì)列以及后續(xù)執(zhí)行序列。(在IMXEventBus中使用)
- isInMainThread:是否在主線程/非主線程執(zhí)行actionBlock
- target:弱引用形式,暫未使用場景
-
行為:
-
actionWIthInfo:forceMainThread::回調(diào)執(zhí)行最終實(shí)現(xiàn)
-
2. IMXEventUserInfo:poster傳輸數(shù)據(jù)
-
數(shù)據(jù)
- userInfo:字典對象
- 待擴(kuò)展
二、邏輯處理:
1. IMXEvent:事件
-
功能:單一事件對象。
- 注冊訂閱者對象
- 響應(yīng)poster觸發(fā)事件
- 即管理和調(diào)度訂閱者隊(duì)列
-
數(shù)據(jù):
- eventName:事件名稱,唯一標(biāo)識(shí)一個(gè)事件。
- mapHigh、mapDefault、mapLow:私有屬性。訂閱者隊(duì)列。NSMaptable定制,target釋放,對應(yīng)記錄也自動(dòng)釋放的特性。
-
行為:
hasContainedSubscribModelForKey::檢查各隊(duì)列中是否包含Key對應(yīng)的訂閱者。registSubscribModel:forKey::注冊訂閱者至對應(yīng)隊(duì)列。-
postEventWithDeliveryData:isInMain:事件出發(fā),逐個(gè)執(zhí)行事件中各隊(duì)列的訂閱者行為。- 并行隊(duì)列嵌入至串行隊(duì)列:保證3個(gè)優(yōu)先級(jí)隊(duì)列順序執(zhí)行。
- 并行隊(duì)列:保證單個(gè)事件隊(duì)列中各訂閱者行為并行執(zhí)行。
- 信號(hào)量處理:控制線程數(shù)量,并行數(shù)。
deleteEntryForTarget::刪除事件中Target對應(yīng)的一條訂閱者記錄。isEmptyMap:各優(yōu)先級(jí)對應(yīng)的隊(duì)列是否全為空
2. IMXEventBus:單例模式,事件集合。
-
數(shù)據(jù):
- events:事件集合。所有針對該集合的處理均在異步線程中串行執(zhí)行,非阻塞主線程行為。
-
行為:
-
registSubscribModel:markEvent:priority:inMainTread:action::注冊訂閱者 -
publishEvent:delivery:isFromMainTread::觸發(fā)事件 -
unregistSubscribModelFromTarget:: 解注冊Target對應(yīng)的訂閱者:若解除后事件無相關(guān)訂閱者,則移除該Event對象。 -
removeEvent:: 移除事件
-
三、public文件:
1. IMXEventSubscriber:注冊訂閱者
主要是針對IMXEventBus注冊接口的封裝。如將優(yōu)先級(jí)和是否主線程執(zhí)行回調(diào)統(tǒng)一置常用值為默認(rèn)值。
2. IMXEventPoster:post觸發(fā)事件
主要是針對IMXEventBus發(fā)布接口的封裝。將是否主線程執(zhí)行回調(diào)統(tǒng)一置常用值為默認(rèn)值。
#待完善:
- Target子類化對象中與Target本身存在有同名事件處理問題(過濾去重功能)。
- 延時(shí)觸發(fā)事件。
- 條件觸發(fā)。
- 其它
#參考:
- GCD
- 線程安全
- http://www.cocoachina.com/ios/20160225/15422.html
- Java EventBus
- https://github.com/lyeah/EventBus/tree/master/EventBus
- https://github.com/AKACoder/ABCEventBus
- https://github.com/benjamincombes/EventBus
- https://github.com/kouky/EventBus
- https://github.com/ShezHsky/EventBus
- https://github.com/chausson/XEBEventBus
- https://github.com/favret/Magic-Swift-Bus
- https://github.com/l9y/SwiftEvent
- https://github.com/cesarferreira/SwiftEventBus
- https://github.com/aixinyunchou/OCEventBus
- https://github.com/goodow/GDChannel
#更新Pods開源庫
- 提交code至github,或改version或保持不變(更改版本時(shí)不需要第3步驟)。
- pod trunk register email@XX.com '<name>' --description='<description>'
- pod trunk delete IMXEventBus 1.0.0
- pod trunk push --allow-warnings
- 使用時(shí):pod setup更新
參考鏈接:http://www.itdecent.cn/p/d6beddcce8bb
更多
- 紕漏之處,歡迎斧正。
- 更多內(nèi)容請關(guān)注公眾號(hào):
IT互聯(lián)網(wǎng)自習(xí)室。
