iOS開發(fā)之一款輕量級(jí)的EventBus

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)入:

  1. Cocoapods:pod 'IMXEventBus', '~> 1.0.0'

  2. 手動(dòng)導(dǎo)入:本庫無依賴其它三方庫,直接將IMXEventBus文件夾拖入項(xiàng)目即可。

    Github地址:https://github.com/PanZhow/IMXEventBus

2.)頭文件引入:

#import "IMXEventBusKit.h"

3.)功能使用:

1. 注冊:
  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]);
      }];
    
  2. 全參模式:

    [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ā)事件:
  1. 簡略模式:

        //默認(rèn)值:
        //被觸發(fā)的事件:不強(qiáng)制在主線程中執(zhí)行回調(diào)
        [IMXEventPoster postEventName:@"login_eventName"    object:@{@"userName":@"demo"}];
    
    
  2. 全參模式:

    [IMXEventPoster postEventName:@"login_eventName" object:nil forceMain:YES];
    
  • 默認(rèn)情況下,firceMain:NO。即所有被觸發(fā)的監(jiān)聽對象,其回調(diào)執(zhí)行均參考自身屬性isInMainThread;否則均強(qiáng)制在主線程執(zhí)行。
3. Debug:
  1. 功能匯總(僅在Debug模式下,log處理):

    1. 重復(fù)添加target對應(yīng)的同一事件時(shí),會(huì)打印或者彈出log提示。

    2. post時(shí),無對應(yīng)的監(jiān)聽者存在,會(huì)打印或者彈出log提示。

      1. Debug模式下:輸出所有Event信息。(便于檢測當(dāng)前無訂閱者的僵尸事件以及未被觸發(fā)的事件)

      注:僅輸出之前的Event調(diào)用情況,無法檢測輸出之后的log,故輸出的數(shù)目不代表最終數(shù)據(jù)。

  2. 開啟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)

IMXEventBus類圖.png

圖譜2:事件注冊流程圖

IMXEventBus注冊監(jiān)聽.png

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

IMXEventBus觸發(fā).png

#結(jié)構(gòu)描述:

一、數(shù)據(jù):

1. IMXEventSubscribModel:訂閱者對象
  • 數(shù)據(jù)

    1. actionBlock:post觸發(fā)時(shí)執(zhí)行該回調(diào)
    2. priority:優(yōu)先級(jí),決定訂閱者對象預(yù)置入哪個(gè)隊(duì)列以及后續(xù)執(zhí)行序列。(在IMXEventBus中使用)
    3. isInMainThread:是否在主線程/非主線程執(zhí)行actionBlock
    4. target:弱引用形式,暫未使用場景
  • 行為:

    1. actionWIthInfo:forceMainThread::回調(diào)執(zhí)行最終實(shí)現(xiàn)
2. IMXEventUserInfo:poster傳輸數(shù)據(jù)
  • 數(shù)據(jù)

    1. userInfo:字典對象
    2. 待擴(kuò)展

二、邏輯處理:

1. IMXEvent:事件
  • 功能:單一事件對象。

    1. 注冊訂閱者對象
    2. 響應(yīng)poster觸發(fā)事件
    3. 即管理和調(diào)度訂閱者隊(duì)列
  • 數(shù)據(jù):

    1. eventName:事件名稱,唯一標(biāo)識(shí)一個(gè)事件。
    2. mapHigh、mapDefault、mapLow:私有屬性。訂閱者隊(duì)列。NSMaptable定制,target釋放,對應(yīng)記錄也自動(dòng)釋放的特性。
  • 行為:

    1. hasContainedSubscribModelForKey::檢查各隊(duì)列中是否包含Key對應(yīng)的訂閱者。

    2. registSubscribModel:forKey::注冊訂閱者至對應(yīng)隊(duì)列。

    3. postEventWithDeliveryData:isInMain:事件出發(fā),逐個(gè)執(zhí)行事件中各隊(duì)列的訂閱者行為。

      1. 并行隊(duì)列嵌入至串行隊(duì)列:保證3個(gè)優(yōu)先級(jí)隊(duì)列順序執(zhí)行。
      2. 并行隊(duì)列:保證單個(gè)事件隊(duì)列中各訂閱者行為并行執(zhí)行。
      3. 信號(hào)量處理:控制線程數(shù)量,并行數(shù)。
    4. deleteEntryForTarget::刪除事件中Target對應(yīng)的一條訂閱者記錄。

    5. isEmptyMap:各優(yōu)先級(jí)對應(yīng)的隊(duì)列是否全為空

2. IMXEventBus:單例模式,事件集合。
  • 數(shù)據(jù):

    1. events:事件集合。所有針對該集合的處理均在異步線程中串行執(zhí)行,非阻塞主線程行為。
  • 行為:

    1. registSubscribModel:markEvent:priority:inMainTread:action::注冊訂閱者
    2. publishEvent:delivery:isFromMainTread::觸發(fā)事件
    3. unregistSubscribModelFromTarget:: 解注冊Target對應(yīng)的訂閱者:若解除后事件無相關(guān)訂閱者,則移除該Event對象。
    4. 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)值。

#待完善:

  1. Target子類化對象中與Target本身存在有同名事件處理問題(過濾去重功能)。
  2. 延時(shí)觸發(fā)事件。
  3. 條件觸發(fā)。
  4. 其它

#參考:

#更新Pods開源庫

  1. 提交code至github,或改version或保持不變(更改版本時(shí)不需要第3步驟)。
  2. pod trunk register email@XX.com '<name>' --description='<description>'
  3. pod trunk delete IMXEventBus 1.0.0
  4. pod trunk push --allow-warnings
  5. 使用時(shí):pod setup更新

參考鏈接:http://www.itdecent.cn/p/d6beddcce8bb

更多

  • 紕漏之處,歡迎斧正。
  • 更多內(nèi)容請關(guān)注公眾號(hào):IT互聯(lián)網(wǎng)自習(xí)室。
IT互聯(lián)網(wǎng)自習(xí)室.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,781評論 25 709
  • 對于Android開發(fā)老司機(jī)來說肯定不會(huì)陌生,它是一個(gè)基于觀察者模式的事件發(fā)布/訂閱框架,開發(fā)者可以通過極少的代碼...
    飛揚(yáng)小米閱讀 1,541評論 0 50
  • 本篇前置閱讀: 創(chuàng)業(yè)公司如何做好財(cái)務(wù)那點(diǎn)事? 創(chuàng)業(yè)者應(yīng)該知道的稅務(wù)知識(shí):基礎(chǔ)篇 我發(fā)現(xiàn)周圍的創(chuàng)業(yè)者們,90%以上都...
    黃非說閱讀 2,238評論 9 32
  • 我最親愛的媽媽,我是你的小寶寶,從什么時(shí)候開始認(rèn)識(shí)你的呢?我也記不清啦,好早好早,或者是上一輩子也說不定哦! 我現(xiàn)...
    莞小主閱讀 511評論 0 0
  • 一個(gè)判斷 if 條件 : input返回的是字符串?。。。。?2個(gè)條件判斷 if : else: 多個(gè)條件判斷 ...
    夏日春風(fēng)閱讀 359評論 0 0

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