作者: zach (http://wereadteam.github.io/2016/06/30/Aspects/#comments)
https://github.com/Jowyer/iOSViewArchDemo/tree/master/Interceptor
1. 背景
最近在做項(xiàng)目的打點(diǎn)統(tǒng)計(jì)的時(shí)候,發(fā)現(xiàn)業(yè)務(wù)邏輯和打點(diǎn)邏輯經(jīng)常耦合在一起,這樣一方面影響了正常的業(yè)務(wù)邏輯越除,同時(shí)也很容易搞亂打點(diǎn)邏輯阅畴,而且要查看打點(diǎn)情況的時(shí)候也很分散员淫,因此想著如何將兩者解耦竖幔,并將打點(diǎn)邏輯集中起來码荔。其實(shí)在 web 編程時(shí)候暮的,這種場景很早就有了很成熟的方案笙以,也就是所謂的 aop 編程(面向切面編程),其原理也就是在不更改正常的業(yè)務(wù)處理流程的前提下冻辩,通過生成一個(gè)動(dòng)態(tài)代理類猖腕,從而實(shí)現(xiàn)對目標(biāo)對象嵌入附加的操作拆祈。
在 iOS 中,要想實(shí)現(xiàn)相似的效果也很簡單倘感,利用 OC 的動(dòng)態(tài)性缘屹,通過 swizzling method 改變目標(biāo)函數(shù)的 selector 所指向的實(shí)現(xiàn),然后在新的實(shí)現(xiàn)中實(shí)現(xiàn)附加的操作侠仇,完成之后再回到原來的處理邏輯轻姿。想明白這些之后,我就打算動(dòng)手實(shí)現(xiàn)逻炊,當(dāng)然并沒有重復(fù)造輪子互亮,我在 github 發(fā)現(xiàn)了一個(gè)基于 swizzling method 的開源框架 Aspects 。這個(gè)庫的代碼量比較小余素,總共就一個(gè)類文件豹休,使用起來也比較方便,比如你想統(tǒng)計(jì)某個(gè) controller 的 viewwillappear 的調(diào)用次數(shù)桨吊,你只需要引入 Aspect.h 頭文件威根,然后在合適的地方初始化如下代碼即可。
-(void)addKvLogAspect
{
[self wr_Aspect_hookSelector:@selector(viewWillAppear:)
withOptions:AspectPositionAfter usingBlock:^{
KVLog_ReviewTimeline(ReviewTimeline_Open_Tab);
}error:NULL];
}
(http://wereadteam.github.io/2016/06/30/Aspects/#comments) 這篇文章主要是介紹 Aspects 源碼以及其思路视乐,以及我在實(shí)際應(yīng)用中遇到的一些問題洛搀。對 swizzling method 不了解的同學(xué)可以先去網(wǎng)上了解一下,下面的內(nèi)容是基于大家對 swizzling method 有一定的了解的基礎(chǔ)上的佑淀。