AppDelegate模組化歷程

2021-09-12 02:19:36 字數 3688 閱讀 8857

在考慮這個方案的時候,我們的專案剛剛度過了原型期,使用的sdk並不多,業務需求也還沒有起來。

- (void)setupreachability;

@end

- (void)setupreachability

else if (reach.currentreachabilitystatus == reachableviawifi)

};reach.unreachableblock = ^(reachability *reach) ;

// start the notifier, which will cause the reachability object to retain itself!

[reach startnotifier]; }

優點:缺點:

隨著業務需求的增加,第三方支付、im、各種url-scheme配置逐漸增加,特別是open url和push notifications需要有依賴關係,方案一很快就不能滿足需求了,各種奇怪的註冊方式交織在一起。

迫於求生欲,我決定第二次重構。

+ (instancetype)sharedinstance;

+ (bool)removemoduledelegatebyclass:(class)moduleclass;

@property (nonatomic, assign) unnotificationpresentationoptions defaultnotificationpresentationoptions;

@end

@implementation ceamwindowdelegate

@end

@implementation ceamreachabilitydelegate

else if (reach.currentreachabilitystatus == reachableviawifi)

};reach.unreachableblock = ^(reachability *reach) ;

[reach startnotifier];

return yes;

}@end

當模組建立完成後,進行註冊後即可生效。

+ (void)load

@end

這裡有兩種方式進行註冊

兩種方式都可以,各有利弊

嗯,是的,所以訊息**機制就在這種時候排上了大用處。

+ (void)load

- (bool)respondstoselector:(sel)aselector

- (nsmethodsignature *)methodsignatureforselector:(sel)aselector

- (void)forwardinvocation:(nsinvocation *)aninvocation

@end

#pragma mark- handle method

/** 無法通過[super respondstoselector:aselector]來檢測物件是否從super繼承了方法。

因此呼叫[super respondstoselector:aselector],相當於呼叫了[self respondstoselector:aselector]

**/- (bool)respondstoselector:(sel)aselector

return result;

}/**

此方法還被用於當nsinvocation被建立的時候,比如在訊息傳遞的時候。

如果當前classf可以處理未被直接實現的方法,則必須覆寫此方法。

*/- (nsmethodsignature *)methodsignatureforselector:(sel)aselector

return [super methodsignatureforselector:aselector];

}/**

無法識別的訊息處理

*/- (void)forwardinvocation:(nsinvocation *)aninvocation

]; } else if (0 == strcmp(returntype, @encode(bool))) ];

} else

}- (bool)hasdelegaterespondstoselector:(sel)selector

}return result;

}- (id)delegaterespondstoselector:(sel)selector

}return resultdelegate;

}/**

通知所有delegate響應方法

@param selector 響應方法

@param nofityhandler delegated處理呼叫事件

*/- (void)notifyselectorofalldelegates:(sel)selector nofityhandler:(void(^)(id delegate))nofityhandler

id delegate;

while ((delegate = enumerater.nextobject)) }}

}/**

通知所有的delegate,當有delegate響應為成功後,中斷通知。

@param selector 響應方法

@param defaultreturnvalue 預設返回值(當設定為yes時,即使沒有響應物件也會返回yes。)

@param nofityhandler delegate處理呼叫事件

@return delegate處理結果

*/- (bool)notifyselectorofalldelegateuntilsuccessed:(sel)selector defaultreturnvalue:(bool)defaultreturnvalue nofityhandler:(bool(^)(id delegate))nofityhandler

id delegate;

while ((delegate = enumerater.nextobject)) }}

}return success;

}

這裡簡單說一下訊息**的流程。

- (bool)respondstoselector:(sel)aselector在呼叫協議方法前,會檢測物件是否實現協議方法,如果響應則會呼叫對應的方法。

- (nsmethodsignature *)methodsignatureforselector:(sel)aselector當呼叫的方法無法找到時,如果未實現此方法,系統就會呼叫nsobject的doesnotrecognizeselector方法,即丟擲異常並crash。當實現了這個方法是,系統會要求返回selector的對應方法實現,這裡就可以開啟訊息**。

- (void)forwardinvocation:(nsinvocation *)aninvocation當方法完成**設定後,會進入這個方法,由我們來控制方法的執行。

在步驟三里,實現了自定義的**方案:

bool返回值的delegate方法,先開啟輪詢通知,同時獲取每次執行的結果,當結果為yes時,表示有模組完成了處理,則結束輪詢。這裡需要注意的是,輪詢順序與註冊順序有關,需要注意註冊順序。

實現了2.0版本後,新增模組已經比較方便了,不過還有很多值得改進的地方。

什麼是模組化?模組化的好處

1.高內聚低耦合,有利於團隊作戰,當專案很複雜的時候,將專案劃分為子模組分給不同的人開發,最後再組合在一起,這樣可以降低模組與模組之間的依賴關係體現低耦合,模組又有特定功能體現高內聚。2.可重用,方便維護,模組的特點就是有特定功能,當兩個專案都需要某種功能的時候,我們定義乙個特定的模組來實現該功能,...

什麼是模組化?模組化怎麼實現?

前言 增加印象,留下腳印 忘記還可以翻一翻 奧利給。1,什麼是模組化 公司裡乙個專案是有很多程式設計師一起開發的,例如 多人運動 這個專案 有程式設計師a 程式設計師b 程式設計師c 程式設計師a 寫了 aaa.js 裡面有幾千行 幾萬行 程式設計師b 寫了 bbb.js 裡面有幾千行 幾萬行 程式...

什麼是模組化?模組化的好處

什麼是模組化?j a 應用架構設計 模組化模式與 osgi 一書中對它的定義是 模組化是一種處理複雜系統分解為更好的可管理模組的方式。所謂的模組化開發就是封裝細節,提供使用介面,彼此之間互不影響,每個模組都是實現某一特定的功能。模組化開發的基礎就是函式。模組化開發使 耦合度降低,模組化的意義在於最大...