在考慮這個方案的時候,我們的專案剛剛度過了原型期,使用的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 一書中對它的定義是 模組化是一種處理複雜系統分解為更好的可管理模組的方式。所謂的模組化開發就是封裝細節,提供使用介面,彼此之間互不影響,每個模組都是實現某一特定的功能。模組化開發的基礎就是函式。模組化開發使 耦合度降低,模組化的意義在於最大...