iOS依赖注入框架系列(二):设置Typhoon

在循环的最后一部分,我们遇到了依赖注入框架为iOS - 台风,并审查其项目Rambler.Pochta使用的基本示例。   这一次,我们进入它的内部结构的研究。  

周期“在iOS中右依赖驱动的应用程序”


介绍

要开始分析一个小字典将被广泛使用在这篇文章中的术语:  
  • 大会(读作[essembli])。 最近相当于俄罗斯 - 装配设计。 台风 - 一个对象,它包含了所有的应用程序依赖的配置,基本上是整个体系结构的骨干。 到外面的世界,当被激活时,像普通的工厂。
  • 定义。 至于俄语翻译- 我印象最深刻的结构中,由于最接近原始版本TyphoonDefinition -是是一种依赖模型包含的信息,如被创建的类的对象,其属性,生命周期的类型的对象。 大部分从以前的文章中的例子处理一样的各种自定义选项TyphoonDefinition。
  • 范围。 这很简单 - 这是使用台风创建的对象的生命周期的类型。
  • 激活。 通过该过程中的所有对象继承人TyphoonAssemby TyphoonDefinition而是开始给类的实例实。 激活的原理和精髓考虑如下。

并再次我要强调的事实,这是理解框架的基本原则很重要 - 然后我们就可以放心地继续前进,并探讨所有其他馍台风,并非住在他们实施的细节。  

为了不成为一个巨大的混乱代码清单,我偶尔也会提及该框架的具体文件,并只给予最有趣的时刻。   我提醒你注意一个事实,即台风框架的当前版本为写这篇文章- 3.1.7。  

初始化

使用台风的应用程序的生存周期如下:  
  • 呼叫main.m文件
  • 创建的UIApplication - [UIApplication的初始化]
  • 创建UIAppDelegate - [UIAppDelegate的init]
  • 呼叫setDelegate:在实例创建的UIApplication
  • 呼叫zasvizzlennoy 教室TyphoonStartup实施setDelegate:
  • 调用-applicationDidFinishLaunching:withOptions:在实例UIAppDelegate



这是zasvizzlennom setDelegate:是创建和激活开始装配。  

自动装料设备可能有两种方式:要么我们已经指出在他们班下的Info.plist键TyphoonInitialAssemblies:  
+(ID)factoryFromPlistInBundle:(*一个NSBundle)软件包

或实现在我们-initialFactory AppDelegate中的方法:  
+(TyphoonComponentFactory *)factoryFromAppDelegate:(ID)的appDelegate

如果不这样做,无论是1还是其他 - 组件将不得不在其他地方创造他的臂膀是不推荐的代码。  

有关台风的初始化更多细节可以在下面的源文件中找到:  
  • TyphoonStartup.m
  • TyphoonComponentFactory.m

激活

这个过程是在框架的关键。   通过激活是指创建类TyphoonBlockComponentFactory,实例是所有活化组件的“发动机罩下”的目的。   因此,任何组件充当与该工厂的通信的接口。  

让我们看看会发生什么,是不是特别进入细节:  
  1. 在TyphoonBlockComponentFactory称为初始化-initWithAssemblies :,而被传递给输入阵列组件,其必须被激活。
  2. 每个生成的活化的组件definition'ov的,指定一个唯一的密钥(该方法的+ Randomnaya字符串名称)。
  3. 所有TyphoonDefinition加入到新创建的注册表TyphoonBlockComponentFactory阵列。



当然,这三个点不限于:为每个注册TyphoonDefinition加入 方面 ,所有依赖svizzlyatsya吸气剂,从而创造一个链初始化TyphoonBlockComponentFactory池中的对象图是实例 -在一般情况下,以确保该框架的操作产生了大量不同的动作。   在这篇文章中,我们将不会进入我们每个程序的细节,因为这会使人忽视的台风一般原理的理解。  

我们已经看到了如何激活TyphoonAssembly -有明白为什么这一切的事。   每当我们根据TyphoonDefinition手动拉组件的任何方法轮番出现以下情况:
- (无效)forwardInvocation:(NSInvocation的*)anInvocation

所得_factory NSInvocation的处理并转换成一个呼叫到以下方法:  
- (ID)componentForKey:(*的NSString)键的args:(TyphoonRuntimeArguments *)的args

据来自selector'a关键方法生成得到一名注册TyphoonBlockComponentFactory definition'ov,然后在此基础上,或者创建一个新的实例或重复使用的缓存。  

更多关于激活过程可以在下列的源文件中找到:  
  • TyphoonAssembly.m
  • TyphoonBlockComponentFactory.m
  • TyphoonTypeDescriptor.m
  • TyphoonAssemblyDefinitionBuilder.m
  • TyphoonStackElement.m

用故事板的工作

引擎盖下台风使用一个子类UIStoryboard - TyphoonStoryboard。   以抓人眼球的第一个特征 - 是一个工厂方法是从其父的额外的参数不同 - 工厂:  
 + (TyphoonStoryboard *)storyboardWithName:(NSString *)name factory:(id<TyphoonComponentFactory>)factory bundle:(NSBundle *)bundleOrNil; 


正是在这家工厂实现协议TyphoonComponentFactory,将搜索屏幕definition'ov当前故事板。   看看依赖注入ViewController'y的各个阶段:  
  1. 首先,我们发现自己在-instantiateViewControllerWithIdentifier :,则重新定义TyphoonStoryboard的方法。
  2. 它通过调用super'a创建所需的控制器的一个实例。
  3. 发起的注入电流控制器的所有相关性及其子公司控制器: 
    - (无效)injectPropertiesForViewController:(*的UIViewController)的viewController
  4. 在TyphoonBlockComponentFactory来熟悉的过程 - 检查当前类TyphoonDefinition和启动注射的工序在她的依赖关系图。 

现在,我不会与TyphoonStoryboard附件中的特定实现居住 -的话题将受到下列文章之一。  

与故事板的工作实现的更多细节,可以在以下源文件中找到:  
  • TyphoonStoryboard.m
  • TyphoonBlockComponentFactory.m

TyphoonDefinition

几乎每一个片断由我以某种形式或给予其他类满足TyphoonDefinition。   正如我所提到何时上市的条件,TyphoonDefinition -一种配置类的创建依赖-在利益放在首位所以对我们来说是它的界面:  
  • 类_type -根据类创建
  • * NSString的_key -这是激活台风时产生的唯一密钥,
  • TyphoonMethod * _initializer -在创建的对象初始化注射 ,包含其参数所需的初始化和收集签名,
  • TyphoonMethod * _beforeInjections -一个方法,将依赖注入之前被调用,
  • TyphoonMethod * _afterInjections -一个将注入依赖后调用的方法,
  • *的NSMutableSet _injectedProperties -通过建立相关的集合注射物业 ,
  • NSMutableOrderedSet * _injectedMethods -收集方法,其中传输依赖于某些( 注射法 )
  • 要创建类型的生命周期的对象, - TyphoonScope范围
  • TyphoonDefinition * _parent - 基本TyphoonDefinition,所有将被当前被继承的属性,
  • BOOL抽象 -一个标志,指示只能用于继承的执行现有的配置,并提出它的对象不应该直接创建。

的个体值得注意范围对象的所有上述性能。  

更多有关TyphoonDefinition的原理可在下列的源文件中找到:  
  • TyphoonDefinition.m
  • TyphoonAssemblyDefinitionBuilder.m
  • TyphoonFactoryDefinition.m
  • TyphoonInjectionByReference.m
  • TyphoonMethod.m

TyphoonScope

如果此工厂将从内存被释放,她清除所有对象图- 重要的是要清楚地认识到,在谈论不同类型的对象的生命周期,我们仍然牢牢绑在实例中使用TyphoonBlockComponentFactory的寿命是很重要的。  
让我们来看看每个结果TyphoonScope值的:  
  • TyphoonScopeObjectGraph 
    在同一范围内构建依赖图形对象的过程中会产生一次。 从技术上讲,它看起来是这样的:你创建一个实例(任何定义)之前,建立一个池为对象图在构建依赖图的过程范围内的对象,所有的对象 - 图范围的进入游泳池,但在创建实例后,池清除。
  • TyphoonScopePrototype 
    每次用范围的TyphoonDefinition将创建类的新实例。
  • TyphoonScopeSingleton 
    与生命周期对象将生活在整个生命TyphoonComponentFactory。
  • TyphoonScopeLazySingleton 
    顾名思义 - 是将在它的第一个电话的时间来创建一个单例。
  • TyphoonScopeWeakSingleton 
    单产生使用这样TyphoonDefinition,完全相同,只要它是由至少一个对象引用的存储在存储器中 -否则它会被释放。

创建的对象,这取决于其配置的范围的特性,被存储在池TyphoonComponentFactory之一,以一定的方式的各动作。  

更多关于缓存依赖台风可在下列资料中找到的原则:  
  • TyphoonComponentFactory.m
  • TyphoonWeakComponentPool.m
  • TyphoonCallStack.m

闭幕

我们不得不考虑台风框架只是最基本的原则 -供应,激活工厂  устройство  TyphoonAssembly  ,  TyphoonStoryboard  ,  TyphoonDefinition  и TyphoonBlockComponentFactory  ,  特别对象的生命周期中创建。   该库包含了很多有趣的概念,它有时干脆迷人的实施。  

我强烈建议休息几天在他们的头上研究埋葬- 它比值得替代了许多经验教训“工作在Xcode鼠标斯威夫特免费的,没有短信”风格的研究,“高级动画指示下载文件。”  

在接下来的文章中,您将学习如何避免巨大的工厂的组装模块的外观,合适的错层结构并覆盖了整个事情的测试。  

周期“在iOS中右依赖驱动的应用程序”


相关链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值