在循环的最后一部分,我们遇到了依赖注入框架为iOS - 台风,并审查其项目Rambler.Pochta使用的基本示例。 这一次,我们进入它的内部结构的研究。
周期“在iOS中右依赖驱动的应用程序”
- 熟悉台风
- 该器件台风
- 模块化台风
- 台风技巧与诀窍
- 台风替代品
- (可选)Rambler.iOS#3。 依赖注入的iOS。 幻灯片
- (可选)Rambler.iOS#3。 依赖注入的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,实例是所有活化组件的“发动机罩下”的目的。 因此,任何组件充当与该工厂的通信的接口。
让我们看看会发生什么,是不是特别进入细节:
- 在TyphoonBlockComponentFactory称为初始化-initWithAssemblies :,而被传递给输入阵列组件,其必须被激活。
- 每个生成的活化的组件definition‘ov的,指定一个唯一的密钥(该方法的+ Randomnaya字符串名称)。
- 所有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的各个阶段:
- 首先,我们发现自己在-instantiateViewControllerWithIdentifier :,则重新定义TyphoonStoryboard的方法。
- 它通过调用super‘a创建所需的控制器的一个实例。
- 发起的注入电流控制器的所有相关性及其子公司控制器:
- (无效)injectPropertiesForViewController:(*的UIViewController)的viewController
- 在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中右依赖驱动的应用程序”
- 熟悉台风
- 该器件台风
- 模块化台风
- 台风技巧与诀窍
- 台风替代品
- (可选)Rambler.iOS#3。 依赖注入的iOS。 幻灯片
- (可选)Rambler.iOS#3。 依赖注入的iOS。 视频