iOS 工程解耦後 訊息傳遞方式

2021-07-03 03:10:43 字數 3347 閱讀 5489

根據上節的介紹,工程之間傳遞訊息可以新增互相的依賴來實現,不過依賴所能解決的問題有一定的侷限性,

如:bu1 對bu2 需要傳遞訊息,可以新增bu1對bu2的依賴,但是如果同時bu2對bu1也要傳遞訊息時,依賴就無法解決了,下面介紹一種更加系統的方法

注:這種方法只適用於上節介紹的解耦方法,其他的不一定適用,讀者可以根據自己的需要使用

根據上節的介紹

main_project ————>bu1

————>business

main_project ————>bu2

我們要做到main_project 、bu1和bu2之間傳遞訊息,只有business是所有的業務層都能使用到的,也是bu和主工程傳遞訊息的媒介。

在business建立**排程系統bus

@inte***cebus : 

nsobject

/***  各業務bu註冊busojbect到匯流排,方便接收匯流排發起的呼叫

**  @param busobj     業務模組的busobject

*/+ (void)register:(busobject *)busobj;

/***  資料匯流排,跨業務模組同步呼叫

**  @param binuessname   業務名

*  @param param         呼叫所帶引數,可變長引數,注意引數均為object型別 *

*  @return

同步呼叫返回的結果

*/+ (id)calldata:(nsstring *)buinessname param:(nsobject *)param, ... ns_requires_nil_termination;

@end

@inte***ce

bus()

@property (nonatomic, strong) nsmutabledictionary *busobjectmap;

//用於存放對外介面子系統的類關係

@end

static

bus *g_bus;

@implementationbus

+ (void)initializebusifneed );}}

+ (bus *)sharedinstance

+ (busobject *)busobjectforname:(nsstring *)bizname

}busobject *busobj = [busobjectmap valueforkey:findkey];

osspinlockunlock(&spinlock);

if (![busobj iskindofclass:[busobject

class]])

return busobj;

}- (id)init

returnself; }

+ (void)register:(ctbusobject *)busobj

[[bus

sharedinstance

].databusobjectmap

setvalue

:busobj 

forkey

:busobj.businessnameprefixandurlhost];

osspinlockunlock(&spinlock);

}+ (id)calldata:(nsstring *)bizname param:(nsobject *)param, ... ns_requires_nil_termination 

va_end(argumentlist);

}id ret = [busobj dodatajob:bizname params:paramarr];

return ret;

}@end

在bu1、bu2和main_project中建立對外介面子系統

main_project有乙個對外的mainbusobject

bu1有乙個對外的bu1busobject

bu2有乙個對外的bu2busobject

為了統一結構,所有的bus子系統都需繼承自busobject

@inte***ce busobject : nsobject

@property (nonatomic, readonly) nsstring *businessnameprefixandurlhost;

- (id)initwithhost:(nsstring *)host;

/***  資料匯流排,同步處理任務,需要子類過載

**  @param businessname 業務名

*  @param params       引數列表,列表中引數型別為物件

**  @return

任務執行結果

*/- (id)dojob:(nsstring *)businessname

params:(nsarray *)params;

@end

@inte***ce

busobject()

@end

@implementationbusobject

- (id)initwithhost:(nsstring *)host

returnself;

}- (nsstring *)businessnameprefixandurlhost

- (id)dojob:(nsstring *)businessname params:(nsarray *)params

@end

當然需要在使用bus之前把所有的子系統都註冊入bus系統

nsdictionary

*busmap = 

@;[busmap enumeratekeysandobjectsusingblock:^(id key, id obj, bool *stop) ];

使用方法:

訊息——

傳遞—>bus——

分配—>busobject——

處理—>返回訊息

我們為bu1busobject建立物件

#import "busobject.h"

@inte***ce bu1busobject : busobject

@end

#import "bu1busobject.h"

@implementationbu1busobject

- (id)dojob:(nsstring *)businessname params:(nsarray *)params

}@end

在bu2中只要 [

ctbus

calldata

:@「bu1/hello"param:

nil]

模板用於解耦

一道 c 思考題 std string 的 operator 和 operator 是如何宣告的,如何避免與 iostream 的過度耦合?iostream 和 string 都可以單獨 include 來使用,顯然 iostream 標頭檔案裡不會定義 string 的 和 操作。那麼 strin...

訊息解耦初探

一般來說解耦有兩條途徑,一是遠端請求,二是訊息 推送 這兩種方式可以說使用的應用場景不一樣,比如說遠端請求這是主動方在呼叫方,而推送的主動權肯定是在生產方。為什麼要解耦?這個。如果用訊息進行應用間解耦,訊息將作為應用間的介質作為上下文傳輸。其實知道生產者和消費者就很容易明白,這樣兩個應用之間將不會有...

Egret開發筆記 七 解耦方式之,掛接解耦

需求 首先,需求是這樣的。戰鬥結算介面 就是戰鬥結束後會有乙個介面顯示這場戰鬥的得失 要顯示一些東西。這些東西並不是固定的,比如,今天有可能要顯示 國慶快樂 明天又是要顯示一幅圖。此處將會舉例顯示乙個元件,因為元件上可以放任何你需要顯示的東西。難點如果需要顯示什麼,就手動在這個介面上,加什麼。那麼後...