Aspects - 也许是你正需要的 AOP 实现
source link: http://www.swiftcafe.io/post/aspects
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
SwiftCafe 享受代码的乐趣
Aspects - 也许是你正需要的 AOP 实现
swift 发布于 2021年09月10日
AOP 模式
AOP 是一种帮助你将代码逻辑变得更清晰的设计模式, 咱们前面的文章中讨论过 AOP 的基本概念, 需要了解的同学可以参考: 聊聊 AOP 模式与 ObjC 对它的实现。
AspectsAspects
是一个使用 ObjC 实现的 AOP 第三方库。 我们前面的文章中也介绍了一些 AOP 的实现方式, 一般通过 runtime 的 Method Swizzling 特性来实现这个模式。 Aspects
的底层也是通过 runtime 的这些函数来实现的。不过它对 runtime 函数进行了比较好的封装,使用了最佳实践来调用 runtime 函数。这样免去了我们自己来调用繁杂的 runtime 函数, 避免了我们在不熟悉的情况下写出的不好的实践。
我们来看看使用 Aspects
如何进行 AOP 实践:
NSLog(@"view did appear");
} error:NULL];
上面的代码应该不难理解, 就是对 UIViewController 的 viewDidAppear 方法进行了一个 hook。 注意 AspectPositionAfter 这个参数,它的意思是我们在实际的 viewDidAppear 调用之后,再执行我们传入的 block 中的代码。
这样,我们在运行 APP 后, 所有 UIViewController 的 viewDidAppear 方法被调用的时候,就会执行我们 block 中的 NSLog 输出日志了。
怎么样,Aspects
实现 AOP 是不是非常简单? 只需要一个调用就完成了。
并且 Aspects
在调试的时候还会在 Stack Trace 中生成相关的标记:
这个特性也是非常好用, 尤其是在你 hook 一些你看不到源码的方法的时候。
实践操作上面对 Aspects
做了一个简单的介绍,接下来我们可以实际用一个小示例操作一下。 我们首先在 XCode 创建一个项目,然后在项目的跟目录中创建一个文件 Cartfile。 如果不确定根目录是什么,保证 Cartfile 和你的 .xcodeproj 文件同级即可。
Cartfile 是 Carthage 包管理工具的配置文件,我比较偏爱使用 Carthage,当然你也可以使用其他包管理工具,或者不使用包管理,直接下载源码。
这样你的目录结构大概是这样, 比如项目名字叫做 aspects:
在 Cartfile 中, 写入这样的内容:
github "steipete/Aspects"这样就告诉 Carthage 我们要配置哪些第三方库。 配置好后,运行这个命令:
carthage update紧接着,你会看到这样的命令输出, Carthage 在下载并且构建 Aspects 库:
构建完成后, 在你的工程文件中会生成一个 Carthage 目录, 这个目录下面的 Build/iOS/Aspects.framework 就是 Carthage 为我们构件好的库了。
最后,将生成的 framewok 拖到 XCode 工程中的 Embedded Binaries 和 Linked Frameworks 中,就完成了这个库的集成:
这样,我们使用 Carthage 完成了 Aspects 库的集成。 关于 Carthage 的基本使用方法,如果你需要了解的话,可以参看这篇文章 Carthage 包管理工具,另一种敏捷轻快的 iOS & MAC 开发体验
开始使用集成工作完成后, 我们可以在工程中创建一个类 AOPHelper, 它的代码也很简单:
#import <Aspects/Aspects.h>#import <UIKit/UIKit.h>
@interface AOPHelper : NSObject
+ (void) setup;
@end
@implementation AOPHelper
+ (void)setup {
[UIViewController aspect_hookSelector:@selector(viewDidAppear:) withOptions:AspectPositionAfter usingBlock:^{
NSLog(@"view did appear");
} error:NULL];
}
@end
它定义了一个 setup 方法, 这个方法中调用 Aspects 的能力对 UIViewController 的 viewDidAppear 方法进行了 hook。 然后在应用启动的时候,我们使用 AOPHelper 来初始化:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[AOPHelper setup];
return YES;
}
这样,所有 viewDidAppear 方法被调用之后, 都会执行我们 hook 的内容, 用 NSLog 输出一条信息。
结语Aspects 对 AOP 模式提供了更好的实践方案, 我们不需要处理 runtime 那些繁琐的函数, 直接使用 Aspects 就可以达成 AOP 模式了。 并且它所提供的 API 逻辑更加直观。 如果你的场景恰好适合 AOP 模式,是否也考虑引入它了呢?
关于 Aspects 的更多内容, 大家看可以参看它的 Github 主页: https://github.com/steipete/Aspects
如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~本站文章均为原创内容,如需转载请注明出处,谢谢。
发现更多精彩
swift-cafe
Recommend
-
70
1、AOP概述AOP Aspect Oriented Programing 面向切面编程 aop作为一种设计理念,拦截方法执行前后,它利用一种称为"横切"的技术,剖解开封装的对象内部, 并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",...
-
49
前不久 JetBrains 在北京搞了一次技术大会,我在演讲当中提到了一个叫 DeepCopy 的库,那么我们今天就来详细说说它。 我们有什么拷贝的需求? 我们知道 Kotlin 的 data class 出厂自带了一套 copy 方...
-
32
也许你需要了解Teams中的会议室分类 最近在一个大型国际企业中遇到一个问题,可以给大家分享一下。该企业在全球范围内使用Teams作为内部沟通协作工具,当然也将原有的思科会议系统全面替换掉了,全部改用MTR(Microsoft Teams R...
-
35
前言 微前端 是当下的前端热词,稍具规模的团队都会去做技术探索,作为一个不甘落后的团队,我们也去做了。也许你看过了 Single-Spa , qiankun 这些业界成熟方案,非常强大:JS沙箱...
-
4
超级英雄密码也许是你隐私的氪星石
-
3
极客之选3min read居家办公比到岗还累?也许你需要一台 SKG 按摩腰靠 T52022/05/18
-
6
也许……数据中心不再需要降低PUE 作者:张申宇 2022-12-27 14:29:21 IDC上下游各企业纷纷“八仙过海,各显其能”,力图进一步降低数据中心PUE。
-
3
这个情人节,也许ta才是你最好的告白 2023-02-09 18:20:23 [ 中关村在线 原创 ] 作者:芝士分子
-
4
我算是知乎最早的一批用户,人生最焦虑的那几年,成为了知乎的重度用户,夜夜翻查知乎,也一路伴随知乎的成长,从十万级到亿级,从封闭走向开放,从知识分享社区到社会化智能社区,从克制欲望到放开自我,知乎摘下了工具化的帽子,建立了社会化媒体标签,知乎的改变...
-
5
我算是知乎最早的一批用户,人生最焦虑的那几年,成为了知乎的重度用户,夜夜翻查知乎,也一路...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK