2 Star 19 Fork 2

京东零售 / SGSAopUtil

Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

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.

Comments ( 1 )

Sign in for post a comment

About

京东自研iOS AOP框架 spread retract
Objective-C
MIT
Cancel

Releases

No release

Contributors

All

Activities

load more
can not load any more
Objective-C
1
https://git.oschina.net/jd-platform-opensource/sgsaoputil.git
git@git.oschina.net:jd-platform-opensource/sgsaoputil.git
jd-platform-opensource
sgsaoputil
SGSAopUtil
master

Search