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

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

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

 
假设有以下场景:ViewControllerA.view里有一个button,点击之后push一个ViewControllerB,最简单的写法类似这样:
 
 
  1. - (void)viewDidLoad 
  2.     [super viewDidLoad]; 
  3.     UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 
  4.     button.frame = CGRectMake(100, 100, 100, 30); 
  5.     [button setTitle:@"Button" forState:UIControlStateNormal]; 
  6.     [button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; 
  7.     [self.view addSubview:button]; 
  8.  
  9. - (void)buttonTapped 
  10.     ViewControllerB *vc = [[ViewControllerB alloc] init]; 
  11.     [self.navigationController pushViewController:vc animated:YES]; 
这样写的一个问题是,ViewControllerA需要import ViewControllerB,也就是对ViewControllerB产生了依赖。依赖的东西越多,维护起来就越麻烦,也容易出现循环依赖的问题,而objection正好可以处理这些问题。
 
实现方法是:先定义一个协议(protocol),然后通过objection来注册这个协议对应的class,需要的时候,可以获取该协议对应的object。对于使用方无需关心到底使用的是哪个Class,反正该有的方法、属性都有了(在协议中指定)。这样就去除了对某个特定Class的依赖。也就是通常所说的「面向接口编程」。
 
 
  1. JSObjectionInjector *injector = [JSObjection defaultInjector]; // [1] 
  2. UIViewController <ViewControllerAProtocol> *vc = [injector getObject:@protocol(ViewControllerAProtocol)]; // [2] 
  3. vc.backgroundColor = [UIColor lightGrayColor]; // [3] 
  4. UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc]; 
  5. self.window.rootViewController = nc; 
[1] 获取默认的injector,这个injector已经注册过ViewControllerAProtocol了。
[2] 获取ViewControllerAProtocol对应的Object。
[3] 拿到VC后,设置它的某些属性,比如这里的backgroundColor,因为在ViewControllerAProtocol里有定义这个属性,所以不会有warning。
 
可以看到这里没有引用ViewControllerA。再来看看这个ViewControllerAProtocol是如何注册到injector中的,这里涉及到了Module,对Protocol的注册都是在Module中完成的。Module只要继承JSObjectionModule这个Class即可。
 
 
  1. @interface ViewControllerAModule : JSObjectionModule 
  2. @end 
  3.  
  4. @implementation ViewControllerAModule 
  5. - (void)configure 
  6.     [self bindClass:[ViewControllerA class] toProtocol:@protocol(ViewControllerAProtocol)]; 
  7. @end 
 
绑定操作是在configure方法里进行的,这个方法在被添加到injector里时会被自动触发。
 
 
  1. JSObjectionInjector *injector = [JSObjection defaultInjector]; // [1] 
  2. injector = injector ? : [JSObjection createInjector]; // [2] 
  3. injector = [injector withModule:[[ViewControllerAModule alloc] init]]; // [3] 
  4. [JSObjection setDefaultInjector:injector]; // [4] 
[1] 获取默认的 injector
[2] 如果默认的 injector 不存在,就新建一个
[3] 往这个 injector 里注册我们的 Module
[4] 设置该 injector 为默认的 injector
 
这段代码可以直接放到 + (void)load里执行,这样就可以避免在AppDelegate里import各种Module。
 
因为我们无法直接获得对应的Class,所以必须要在协议里定义好对外暴露的方法和属性,然后该Class也要实现该协议。
 
 
  1. @protocol ViewControllerAProtocol <NSObject> 
  2. @property (nonatomic) NSUInteger currentIndex; 
  3. @property (nonatomic) UIColor *backgroundColor; 
  4. @end 
  5.  
  6. @interface ViewControllerA : UIViewController <ViewControllerAProtocol> 
  7. @end 
 
通过objection实现依赖注入后,就能更好地实现SRP(Single Responsibility Principle),代码更简洁,心情更舒畅,生活更美好。拿Pinterest来说,下面的页面就可以划分为3个Section。
 
各个Section可以由不同的人负责,然后串到一起就行,也能一定程度地避免MVC(Mess View Controller)的出现。
 
总体来说,这个lib还是挺靠谱的,已经维护了两年多,也有一些项目在用,对于提高开发成员的效率也会有不少的帮助,可以考虑尝试下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Objection, wallbreaker"这个词组的意思可能是指在辩论或讨论中,对破除对方观点或阻碍的反对意见或观点。如果我要用300字回答这个问题,我会这样表达: 在辩论或讨论中, "objection, wallbreaker"是指提出反对意见或观点,意图破除或击破对方观点或阻碍。这个词组的出现通常是为了追求真实和公正的辩论,希望通过不同观点的碰撞促进智慧和认识的增长。 每个人都有自己的观点和立场,而辩论是一个相互交流、较量、甚至对抗观点的过程。当有人提出"objection, wallbreaker"时,他们可能持有不同的观点,希望通过辩论来找到真相或者找到更好的解决办法。 然而,在提出"objection, wallbreaker"时,我们也需要注意呈现我们的观点要公正和明晰。我们应该以理性的态度和充分的证据来支持我们的反对意见,而不是简单地提出不成熟的批评或个人攻击。 辩论中的"objection, wallbreaker"是一种促进思考和发展的机会。通过挑战和争论,我们可以更清晰地理解对方观点的有趣之处和缺点。这种挑战有助于增强我们的辩论能力、提升思维的灵活性,并可能在辩论过程中改变我们自己的立场。 总之,"objection, wallbreaker"是辩论中常见的现象之一,它代表了追求真相和理解的努力。在辩论中提出反对观点时,我们必须以开放和尊重的态度对待对方,并用理性的方式来支持我们的观点。通过这样的辩论,我们可以共同进步,获得深入的认识和智慧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值