`
jsntghf
  • 浏览: 2532755 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

使用objection来模块化开发iOS项目

    博客分类:
  • iOS
阅读更多

objection是一个轻量级的依赖注入框架,受Guice的启发,Google Wallet也是使用的该项目。「依赖注入」是面向对象编程的一种设计模式,用来减少代码之间的耦合度。通常基于接口来实现,也就是说不需要new一个对象,而是通过相关的控制器来获取对象。2013年最火的PHP框架laravel就是其中的典型。

 

假设有以下场景:ViewControllerA的view里有一个button,点击之后push到ViewControllerB,最简单的写法类似这样:

- (void)viewDidLoad { 
    [super viewDidLoad];
	 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 
    button.frame = CGRectMake(100, 100, 100, 30); 
    [button setTitle:@"PUSH" forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:button]; 
} 
 
- (void)buttonTapped { 
    ViewControllerB *vc = [[ViewControllerB alloc] init]; 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

 

这样写的一个问题是,ViewControllerA需要import ViewControllerB,也就是对ViewControllerB产生了依赖。依赖的东西越多,维护起来就越麻烦,也容易出现循环依赖的问题,而objection正好可以处理这些问题。

 

下面我们来看下使用objection如何实现上面的需求。

 

首先,定义一个协议(protocol),然后通过objection来注册这个协议对应的Class,需要的时候,可以获取该协议对应的object。对于使用方无需关心到底使用的是哪个Class,反正该有的方法、属性都有了(在协议中指定)。这样就去除了对某个特定Class的依赖。也就是通常所说的「面向接口编程」。

// 获取默认的injector,这个injector已经注册过BViewControllerProtocol了
JSObjectionInjector *injector = [JSObjection defaultInjector];
// 获取BViewControllerProtocol对应的Object
UIViewController <BViewControllerProtocol> *vc = [injector getObject:@protocol(BViewControllerProtocol)];
// 拿到vc后,设置它的属性,因为在BViewControllerProtocol里有定义对应的属性,所以不会有warning
vc.backgroundColor = [UIColor redColor];
vc.currentIndex = 1000;
[self.navigationController pushViewController:vc animated:YES];

 

可以看到这里没有引用BViewController。

 

再来看看这个BViewControllerProtocol是如何注册到injector中的,这里涉及到了Module,对Protocol的注册都是在Module中完成的。Module只要继承JSObjectionModule这个Class即可。

@interface BViewControllerModule : JSObjectionModule

@end

@implementation BViewControllerModule

- (void)configure {
    [self bindClass:[BViewController class] toProtocol:@protocol(BViewControllerProtocol)];
}

@end

 

绑定操作是在configure方法里进行的,这个方法在被添加到injector里时会被自动触发。

 

// 获取默认的injector
JSObjectionInjector *injector = [JSObjection defaultInjector];
// 如果默认的injector不存在,就新建一个
injector = injector ? : [JSObjection createInjector];
// 往这个injector里注册Module
injector = [injector withModule:[[BViewControllerModule alloc] init]];
// 设置该injector为默认的injector
[JSObjection setDefaultInjector:injector];

 

上面这段代码可以直接放到 + (void)load里执行,这样就可以避免在AppDelegate里import各种Module了。

 

因为我们无法直接获得对应的Class,所以必须要在协议里定义好对外暴露的方法和属性,然后该Class也要实现该协议。

@protocol BViewControllerProtocol <NSObject>

@property (nonatomic) NSUInteger currentIndex;
@property (nonatomic) UIColor *backgroundColor;

@end

@interface BViewController : UIViewController<BViewControllerProtocol>

@end

 

通过objection实现依赖注入后,就能更好地实现SRP(Single Responsibility Principle),代码更简洁。

 

本文的demo示例下载:http://download.csdn.net/detail/jsntghf/8584513

分享到:
评论

相关推荐

    Objection简单使用示例(源码)

    在 iOS 开发中,依赖注入是一种设计模式,它允许我们将对象的依赖关系在运行时动态地传入,而不是在类的初始化时硬编码。这有助于降低耦合度,使得单元测试变得更加容易,因为我们可以为测试创建模拟对象,而无需...

    objection修改计划-IOS新增功能篇

    在iOS开发领域,Objection是一个流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是底层数据管理。本文将深入探讨“objection修改计划”中的iOS新增功能,旨在帮助开发者更...

    objection基本使用+ Wallbreaker

    `objection` 是一个基于 ` Frida ` 的 Android 动态分析框架,它提供了一种简单易用的方式来挂钩(hook)应用,探索其内部工作原理,以及进行一系列的内存操作。`Wallbreaker` 是 `objection` 的一个插件,增强了类...

    Python-objection运行时移动探索工具包

    在Python开发中,Objection库的使用极大地简化了与目标应用程序交互的过程。它支持多种功能,包括但不限于: 1. **远程控制**:Objection可以连接到目标设备,通过TCP或USB接口实现远程控制,允许安全研究人员在...

    PyPI 官网下载 | objection-1.0.2.tar.gz

    然而,对于"objection-1.0.2.tar.gz"这样的源代码包,我们需要先解压缩,然后通过编译和安装步骤来使用。解压后,我们可以看到文件夹"objection-1.0.2",它可能包含以下结构: - `setup.py`:这是Python项目的核心...

    Android-objection.zip

    【Android-objection.zip】是一个与Android系统相关的压缩文件,其中包含了名为`objection-master`的项目或库。从描述中我们可以推断,这个文件可能与Android应用的安全性和逆向工程有关,因为“反对-运行时移动探索...

    Node.js-Objection.js-Node.js一个SQL友好的轻量级ORM

    **Node.js与Objection.js ORM** Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它以其异步非阻塞I/O和高性能而受到广大...无论是小型项目还是大型应用,Objection.js都能作为一个强大的工具,提升开发效率。

    Objection Detection.zip

    【标题】"Objection Detection.zip" 是一个关于物体检测技术的压缩包,特别是针对车辆检测的应用。这个项目可能包含了一套基于YOLO(You Only Look Once)算法的Python实现,用于实现实时的车辆识别系统。 YOLO是...

    ios-iOS一键重签名,轻松制作iOS上任意应用或游戏分身、以及Hook后重签名安装到非越狱或越狱设备等.zip

    iOS一键重签名,轻松制作iOS上任意应用或游戏分身、以及Hook后重签名安装到非越狱或越狱设备等,以下是功能说明 1. 自动识别传入的文件为.app文件或.ipa文件,并进行不同的处理 2. 可指定重签名后ipa导出路径...

    objection-find:使用HTTP查询参数为objection.js模型构建搜索查询

    可以使用objection.js关系表达式来获取结果的关系。 在路线中使用异议查找非常简单: const findQuery = require ( 'objection-find' ) ;// Our objection.js model.const Person = require ( '../models/Person' )...

    objection-filter:使用复杂的搜索查询通过HTTP过滤objection.js模型

    3.汇总和报告在模型上创建快速计数和总和可以大大加快开发速度。 一个示例可以是客户模型的numberOfOrders 。捷径安装npm i objection-filter --save objection-filter&gt; = 1.0.0与旧查询完全向后兼容,但现在支持...

    objection-softdelete:使用您的Objection.js模型自动处理软删除

    反对软删除 使用您的Objection.js模型自动处理软删除。安装从npm安装: npm install objection-softdelete 使用异议实例注册插件: const objectionSoftDelete = require ( 'objection-softdelete' ) ;...

    iOS:用于iOS渗透测试的最有用的工具

    一些常用的越狱工具有checkra1n、Unc0ver和Chimera等,它们利用特定的iOS版本漏洞来实现设备的自由化。 2. **Objective-C和Swift**:iOS应用程序主要使用Objective-C和Swift编写。因此,理解这两种编程语言的基本...

    agile-model:使用knex和objection初始化一个nodejs项目。 生成模型和关联的数据库CRUD文件,类似于Rails ActiveRecord

    因为我总是在项目中花费相同的时间来创建相同的结构,所以我可以用它来提供更多很棒的功能:) 用法 这是一个全局程序包,应在项目的根目录下运行。 初始化 首先,运行: agile-model init 这将在项目根目录中创建一...

    objection-password:Objection.js的自动密码哈希

    安装NPM npm i objection-password 纱yarn add objection-password 版本兼容性节点版本插件版本&lt;12&gt; = 12 &gt; = 3.x 如果您使用的是Node 12或更高版本,请使用插件的3.x版本,因为它包含bcrypt 5.x ,其中包含重要的...

    FridaAndroid05-Objection实战

    【Frida】【Android】05_Objection实战 示例程序

    citrus:使用Objection.js ORM进行模型定义[Grapefruit]

    本篇文章将深入探讨如何在Citrus项目中使用Objection.js进行模型定义,以提升开发效率和代码可维护性。 首先,让我们理解什么是ORM。ORM是一种编程技术,用于提供一个中间层,将应用程序的逻辑与底层的数据库结构...

    swift-App框架RACMVVMObjection路由

    在Swift应用中,Objection可以帮助开发者避免硬编码依赖,通过配置和注解来管理对象的生命周期。这样,测试和替换组件变得更加容易,提高了代码的可扩展性和可维护性。 4. 路由(Routing): 在App开发中,路由...

    RAC+MVVM+路由

    **Objection** 是一个轻量级的对象映射器(Object Relational Mapper,ORM),用于iOS和macOS开发。它简化了数据库操作,使得开发者无需直接编写SQL语句,而是通过对象来操作数据。Objection还提供了一种简单的方式...

    bizhi, 使用 ReactiveCocoa2/MVVM/objection 创建壁纸应用程序.zip

    bizhi, 使用 ReactiveCocoa2/MVVM/objection 创建壁纸应用程序 简介一个简单的壁纸应用演示了使用 ReactiveCocoa2,MVVM和反对屏幕截图 安装克隆到本地后,运行 pod install

Global site tag (gtag.js) - Google Analytics