1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jd-platform-opensource-sgsaoputil

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 3.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
liuzexiang Отправлено 26.11.2020 09:51 0758416

SGSAopUtil license platform platform

京东-平台业务中心开源的iOS平台轻量级面向切面编程工具。

SGSAopUtil 以友好的方式帮助你快速增加切面,并灵活进行精确切面切面与切面切面与原方法等的协同编程。

SGSAopUtil 源于京东商城移动研发提效平台 Sunglasses,主要用于京东商城App开发团队的研发、测试提效场景,帮助研发团队快速定位、确认问题。不建议用于生产环境。

目前已知在分类等场景下可能会出现问题,欢迎大家踊跃PR,共同完善。

使用方式

  1. 创建切面
  • 新的切面必须放在新的类中,新的类仅需继承NSObject

  • 在切面类中重写目标方法即可

  • 通过引入 SGSAopUtil.h,并调用宏 sgs_AOP_callOriginalSelector() 来触发原始方法

如,一下例子为CollectionView的获取Cell的方法前、后增加切面:

#import "SGSAopUtil.h"
@interface CollectionViewDataSourceAspect : NSObject
@end

@implementation CollectionViewDataSourceAspect
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"【Generate Cell】%@:%zd-%zd",collectionView, indexPath.section, indexPath.item);
    return sgs_AOP_callOriginalSelector();
}
@end
  1. 添加切面
  • 在合适的时机通过 +[SGSAopUtil hookWithTargetContainerObject:withNewProcessClass:] 方法增加切面

  • 需要明确切面的目标:具体的某个对象 / 某个类

如,为所有的CollectionView增加上述切面:

#import "SGSAopUtil.h"

// ···

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // ···
    Class target = NSClassFromString(@"UICollectionView");
    Class aspect = NSClassFromString(@"CollectionViewDataSourceAspect");
    [SGSAopUtil hookWithTargetContainerObject:target withNewProcessClass:aspect];
    // ···
}

// ···

安装

直接将项目中的 SGSAopUtil/ 文件夹下的两个文件拷贝如项目即可

// TODO: 增加Pod/Carthage接入方式

使用进阶

精确切面

SGSAopUtil 允许你进行对象方法的精确切面,每个目标之间相互独立

切面协同/切面接力

当一个目标(对象方法)增加了多个切面时,方式执行会以递归的方式将多个切面分别执行,添加切面会将当前切面 入栈,执行切面的顺序为 出栈 的顺序。

调用 sgs_AOP_callOriginalSelector() 会执行目标 中的下一个切面,如果已经 栈底 ,则执行原始方法。

协同/接力功能

  • 通过调用 sgs_AOP_callOriginalSelector() 之前将当前方法的入参修改,达到影响下一个切面/原方法直接结果的目的。
  • 通过接收 sgs_AOP_callOriginalSelector() 的返回值,来获取下一个切面/原始方法的执行结果,从而实现结合下一个切面结果的接力。

联系我们

使用过程中如有疑问,欢迎联系我们。

联系方式

email

微信)

License

MIT license.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/jd-platform-opensource-sgsaoputil.git
git@api.gitlife.ru:oschina-mirror/jd-platform-opensource-sgsaoputil.git
oschina-mirror
jd-platform-opensource-sgsaoputil
jd-platform-opensource-sgsaoputil
master