{"id":263495,"date":"2015-08-13T15:28:02","date_gmt":"2015-08-13T11:28:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=263495"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=263495","title":{"rendered":"\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e: Typhoon Tips &#038; Tricks"},"content":{"rendered":"<p>     \t<img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ccd\/53f\/44f\/ccd53f44f24f4460ac23186eff422e06.jpg\"\/><\/p>\n<p>  <i>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0446\u0438\u043a\u043b\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b <b>Typhoon<\/b> \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u0445 \u0442\u0435\u043c, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/i><br \/>  <a name=\"habracut\"><\/a><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Typhoon Framework:  <\/p>\n<ul>\n<li><b>\u0410\u0432\u0442\u043e\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f<\/b> (\u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u043a autowiring),<\/li>\n<li>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0438\u0437 <b>\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439<\/b> \u043e\u0434\u043d\u043e\u0433\u043e <i><b>TyphoonDefinition<\/b><\/i>,<\/li>\n<li>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <i><b>TyphoonConfig<\/b><\/i><\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <i>TyphoonPatcher<\/i> \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 <b>\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432<\/b>,<\/li>\n<li>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <b>runtime-\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432<\/b> \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432,<\/li>\n<li><b>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0430\u0431\u0440\u0438\u043a<\/b> \u043d\u0430 \u0431\u0430\u0437\u0435 <i>TyphoonAssembly<\/i>,<\/li>\n<li><b>\u041f\u043e\u0441\u0442\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/b>, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Typhoon,<\/li>\n<li>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f <b>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432<\/b>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4><b>\u0426\u0438\u043a\u043b \u00ab\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u00bb<\/b><\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/258325\/\">\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Typhoon<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/260355\/\">\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Typhoon<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/261537\/\">\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c Typhoon<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/262999\/\">Typhoon Tips &#038; Tricks<\/a><\/li>\n<li>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b Typhoon<\/li>\n<li><i><a href=\"http:\/\/www.slideshare.net\/Rambler-iOS\/dependency-injection-ios\">(\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e) Rambler.iOS #3. Dependency Injection \u0432 iOS. \u0421\u043b\u0430\u0439\u0434\u044b<\/a><\/i><\/li>\n<li><i><a href=\"https:\/\/www.youtube.com\/watch?v=LO59z3fjc9k\">(\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e) Rambler.iOS #3. Dependency Injection \u0432 iOS. \u0412\u0438\u0434\u0435\u043e<\/a><\/i><\/li>\n<\/ul>\n<p>  <\/p>\n<h4><b>\u0410\u0432\u0442\u043e\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438\/Autowire<\/b><\/h4>\n<p>  \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f <i>TyphoonAssembly<\/i> \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439, \u0442\u0430\u043a \u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u0430\u043a autowiring. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@interface RCMMessageViewController : UIViewController<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#import &lt;Typhoon\/TyphoonAutoInjection.h&gt;  @protocol RCMMessageService; @class RCMMessageRendererBase;  @interface RCMMessageViewController : UIViewController  @property (strong, nonatomic) InjectedProtocol(RCMMessageService) messageService; @property (strong, nonatomic) InjectedClass(RCMMessageRendererBase) renderer;  @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 <i>TyphoonAssembly<\/i> \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0430\u044f \u0432 <i>Info.plist<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@implementation RCMHelperAssembly<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>@implementation RCMHelperAssembly  - (RCMMessageRendererBase *)messageRenderer {     return [TyphoonDefinition withClass:[RCMMessageRendererBase class]]; }  - (id &lt;RCMMessageService&gt;)messageService {     return [TyphoonDefinition withClass:[RCMMessageServiceBase class]]; }  @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0a6\/1ac\/e71\/0a61ace7164f459b8a94a4c5507a04ff.png\"\/><\/p>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041e\u0431\u0440\u0430\u0449\u0430\u044e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u0432\u0442\u043e\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043e\u0442\u0434\u0430\u044e\u0449\u0438\u0439 <i>TyphoonDefinition<\/i> \u0434\u043b\u044f <i>ViewController&#8217;\u0430<\/i>. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <i>UIViewController<\/i> \u0438\u0437 <i>TyphoonStoryboard<\/i>.<\/p>\n<p>  \u041f\u043e\u0445\u043e\u0436\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0438 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 <i>TyphoonAssembly<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@interface RCMMessageServiceBaseTests : XCTestCase<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#import &lt;Typhoon\/TyphoonAutoInjection.h&gt;  @interface RCMMessageServiceBaseTests : XCTestCase @property (nonatomic, strong) InjectedProtocol(RCMMessageService) messageService; @end  @implementation RCMMessageServiceBaseTests  - (void)setUp { \t[super setUp]; \t[[[RCMServiceComponentsAssemblyBase new] activate] inject:self]; }  - (void)testThatServiceObtainsMessage {     \/\/ ... }  @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 <i>UIViewController<\/i>, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043b\u0438\u0431\u043e \u0438\u0437 xib.<\/p>\n<p>  \u041a\u0430\u043a \u0438 \u0443 \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0443 autowire \u0435\u0441\u0442\u044c \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430:  <\/p>\n<ul>\n<li><b>\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/b> \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 assembly,<\/li>\n<li><b>\u0411\u043e\u043b\u0435\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/b> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u2014 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Typhoon, \u043a\u0430\u043a\u0438\u0435 \u2014 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e,<\/li>\n<li>\u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e \u0438\u0437 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u0444\u0430\u0431\u0440\u0438\u043a\u0435, <b>crash \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435<\/b> (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0439\u0442\u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c).<\/li>\n<\/ul>\n<p>  \u0442\u0430\u043a \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:  <\/p>\n<ul>\n<li><b>\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a Typhoon<\/b> \u0443\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b assembly \u0438 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b,<\/li>\n<li>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 <i>TyphoonAssembly<\/i> \u043f\u0440\u043e\u0435\u043a\u0442\u0430, <b>\u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0443\u0434\u0438\u0442\u044c \u043e \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435<\/b> \u0432 \u0446\u0435\u043b\u043e\u043c.<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u043c\u0438 \u0432 <b>Rambler&#038;Co<\/b> \u2014 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0443\u0440\u043e\u0432\u043d\u044f Presentation, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f definition&#8217;\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 ViewController&#8217;\u043e\u0432, \u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 autowire \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <i>TyphoonAssembly<\/i> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430 \u0430\u0432\u0442\u043e\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438.<\/p>\n<h4><b>TyphoonDefinition+Option<\/b><\/h4>\n<p>  <a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/261537\/\">\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043e\u0434\u043d\u043e\u0439 <i>TyphoonAssembly<\/i> \u2014 \u0431\u043e\u0435\u0432\u043e\u0439 \u0438 \u0444\u0435\u0439\u043a\u043e\u0432\u043e\u0439. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0438\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0440\u0430\u0432\u043d\u043e\u0441\u0438\u043b\u0435\u043d \u0441\u0442\u0440\u0435\u043b\u044c\u0431\u0435 \u0438\u0437 \u043f\u0443\u0448\u0435\u043a \u043f\u043e \u0432\u043e\u0440\u043e\u0431\u044c\u044f\u043c \u2014 \u0430 Typhoon \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u044f\u0449\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u0435\u0439\u0441 \u0438\u0437 <b>\u0420\u0430\u043c\u0431\u043b\u0435\u0440.\u041f\u043e\u0447\u0442\u044b<\/b>:<br \/>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 QA \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 debug-\u043c\u0435\u043d\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043b\u043e\u0433\u0430\u043c\u0438, \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u043e\u043c\u0435\u0440 \u0431\u0438\u043b\u0434\u0430 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0432\u0435\u0449\u0438. \u042d\u043a\u0440\u0430\u043d \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u2014 \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 ViewModel&#8217;\u0435\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c <i>RCMSettingsConfigurator<\/i>. \u0423 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 Base \u0438 Debug, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 build scheme. \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u0441\u0442\u0430\u043b \u0432\u044b\u0431\u043e\u0440 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438:  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <i>#ifdef<\/i>&#8216;\u043e\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b,<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 assembly, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f user story \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a,<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <i>TyphoonDefinition+Option<\/i>.<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0432\u044b\u0431\u043e\u0440 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043d\u0438\u043d\u0434\u0437\u044f (\u043d\u0443 \u043d\u0435 \u0434\u0435\u043b\u043e \u044d\u0442\u043e, \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>#ifdef<\/i>&#8216;\u044b \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f). \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u044d\u0442\u043e \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0430\u044f \u043f\u0443\u0448\u043a\u0430, \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u043d\u0435\u0432\u0438\u043d\u043d\u044b\u0445 \u0432\u043e\u0440\u043e\u0431\u044c\u0435\u0432. \u0422\u0440\u0435\u0442\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0438\u0431\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043d\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 definition&#8217;\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u043e\u043b\u0435 option:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@interface TyphoonDefinition (Option)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>@interface TyphoonDefinition (Option)  + (id)withOption:(id)option yes:(id)yesInjection no:(id)noInjection; + (id)withOption:(id)option matcher:(TyphoonMatcherBlock)matcherBlock; + (id)withOption:(id)option matcher:(TyphoonMatcherBlock)matcherBlock autoInjectionConfig:(void(^)(id&lt;TyphoonAutoInjectionConfig&gt; config))configBlock;  @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u043c \u043a\u0435\u0439\u0441\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (id &lt;RCMSettingsConfigurator&gt;)settingsConfigurator<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (id &lt;RCMSettingsConfigurator&gt;)settingsConfigurator {     return [TyphoonDefinition withOption:@(DEBUG)                                  \tyes:[self debugSettingsConfigurator]                                   \tno:[self baseSettingsConfigurator]]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <i>TyphoonOptionMatcher<\/i> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (id &lt;RCMSettingsConfigurator&gt;)settingsConfiguratorWithOption:(id)option<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (id &lt;RCMSettingsConfigurator&gt;)settingsConfiguratorWithOption:(id)option {     return [TyphoonDefinition withOption:option matcher:^(TyphoonOptionMatcher *matcher) {     \t[matcher caseEqual:@&quot;qa-team&quot; use:[self qaSettingsConfigurator]];     \t[matcher caseEqual:@&quot;big-bosses&quot; use:[self bigBossesSettingsConfigurator]];     \t[matcher caseEqual:@&quot;ios-dream-team&quot; use:[self iosTeamSettingsConfigurator]];     \t[matcher caseMemberOfClass:[RCMConfiguratorOption class] use:[self settingsConfiguratorWithOption:option]];     \t[matcher defaultUse:[self defaultSettingsConfigurator]]; \t}]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 option \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0433\u043e <i>TyphoonDefinition<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (id &lt;RCMSettingsConfigurator&gt;)settingsConfiguratorWithOption:(id)option<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (id &lt;RCMSettingsConfigurator&gt;)settingsConfiguratorWithOption:(id)option {     return [TyphoonDefinition withOption:option matcher:^(TyphoonOptionMatcher *matcher) {     \t[matcher useDefinitionWithKeyMatchedOptionValue]; \t}];     \/\/ \u041f\u0440\u0438 option = @&quot;debugSettingsConfigurator&quot; \u0432\u0435\u0440\u043d\u0435\u0442 definition \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 - debugSettingsConfigurator }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u044d\u0442\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u2014 \u0435\u0441\u043b\u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u044b \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <i>TyphoonAssembly<\/i>.<\/p>\n<h4><b>TyphoonConfig \u0438 TyphoonTypeConverter<\/b><\/h4>\n<p>  <a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/258325\/\">\u0412 \u0441\u0430\u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Typhoon \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b <i>TyphoonConfig<\/i>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0435\u0433\u043e \u0434\u043b\u044f \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 URL \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e API \u0432 \u043e\u0434\u0438\u043d \u0438\u0437 network-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435.<\/p>\n<p>  \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432:  <\/p>\n<ul>\n<li><i>plist<\/i>,<\/li>\n<li><i>properties<\/i>,<\/li>\n<li><i>json<\/i><\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (\u0447\u0438\u0441\u043b\u0430, BOOL, \u0441\u0442\u0440\u043e\u043a\u0438) \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u00ab\u043a\u0430\u043a \u0435\u0441\u0442\u044c\u00bb:  <\/p>\n<pre><code class=\"javascript\">{     &quot;config&quot;: {         &quot;defaultFontSize&quot;: 17,         &quot;openLinksInExternalBrowser&quot; : NO \t} }<\/code><\/pre>\n<p>  Typhoon \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438: <i>NSURL<\/i>, <i>UIColor<\/i>, <i>NSNumber<\/i>, <i>UIImage<\/i>. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:  <\/p>\n<pre><code class=\"javascript\">{ \t&quot;config&quot;: {     \t    &quot;baseURL&quot;: NSURL(https:\/\/ mail.rambler.ru),             &quot;logoImage&quot; : UIImage(rambler-mail-logo-new) \t} }<\/code><\/pre>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 TypeConverter \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0442\u0438\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u2014 <i>RCMStyleModel<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@interface RCMStyleTypeConverter : NSObject &lt;TyphoonTypeConverter&gt;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>typedef NS_ENUM(NSUInteger, RCMStyleComponent) { \tRCMStylePrimaryColorComponent = 0, \tRCMStyleDefaultFontSizeComponent = 1, \tRCMStyleDefaultFontNameComponent = 2 };  @interface RCMStyleTypeConverter : NSObject &lt;TyphoonTypeConverter&gt; @end  @implementation RCMStyleTypeConverter  - (NSString *)supportedType {     return @&quot;RCMStyle&quot;; }  - (id)convert:(NSString *)stringValue {     NSArray *styleComponents = [stringValue componentsSeparatedByString:@&quot;;&quot;];         NSString *colorString = styleComponents[RCMStylePrimaryColorComponent];     UIColor *primaryColor = [self colorFromHexString:colorString];         NSString *defaultFontSizeString = styleComponents[RCMStyleDefaultFontSizeComponent];     CGFloat defaultFontSize = [defaultFontSizeString floatValue];         NSString *defaultFontName = styleComponents[RCMStyleDefaultFontNameComponent];     UIFont *defaultFont = [UIFont fontWithName:defaultFontName size:defaultFontSize];         RCMStyleModel *styleModel = [[RCMStyleModel alloc] init]; \tstyleModel.primaryColor = primaryColor; \tstyleModel.defaultFontSize = defaultFontSize; \tstyleModel.defaultFont = defaultFont;         return styleModel; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0438\u043b\u044c \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u0438\u0434\u0435:  <\/p>\n<pre><code class=\"javascript\">{ \t&quot;config&quot;: {     \t    &quot;defaultStyle&quot;: RCMStyle(#8732A9;17;HelveticeNeue-Regular),             &quot;anotherStyle&quot; : RCMStyle(#AABBCC;15;SanFrancisco) \t} }<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043e\u0431 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e TypeConverter&#8217;\u0430.<\/p>\n<h4><b>TyphoonPatcher<\/b><\/h4>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0438 unit \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 \u043e\u0442\u0440\u044b\u0432\u0435 \u043e\u0442 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u0422\u0430\u043a \u0432\u043e\u0442, Typhoon \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u0435\u043d \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>  \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<br \/>  <b><i>RCMPushNotificationCenter -&gt; RCMPushService -&gt; RCMNetworkClient<\/i><\/b><\/p>\n<p>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <i>RCMPushNotificationCenter<\/i> \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043d\u0435\u0433\u043e stub&#8217;\u043e\u0432\u044b\u0439 <i>RCMPushService<\/i> \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <i>TyphoonAssembly<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (void)setUp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (void)setUp { \t[super setUp];      NSArray *collaboratingAssemblies = @[[RCMClientAssembly new], [RCMCoreComponentsAssembly new]];     TyphoonAssembly&lt;RCMServiceComponents&gt; *serviceComponents = [[RCMServiceComponentsAssemblyBase new] activateWithCollaboratingAssemblies:collaboratingAssemblies];     self.pushNotificationCenter = [serviceComponents pushNotificationCenter];         TyphoonPatcher *patcher = [[TyphoonPatcher alloc] init]; \t[patcher patchDefinitionWithSelector:@selector(networkClient) withObject:^id{         return [RCMFakeNetworkClient new]; \t}]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041e\u0431\u044a\u0435\u043a\u0442 <i>TyphoonPatcher<\/i> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043e\u0442\u0434\u0430\u044e\u0449\u0438\u0439 <i>TyphoonDefinition<\/i>, \u0432 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 <i>TyphoonAssembly<\/i>. \u0412 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u043c <i>TyphoonPatcher<\/i> \u0431\u043b\u043e\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c mock&#8217;\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438.<\/p>\n<h4><b>Runtime arguments<\/b><\/h4>\n<p>  Typhoon \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043d\u043e \u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c runtime \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <i>RCMMessageViewController<\/i>, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 <i>RCMMessage<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (void)setUp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>@interface RCMMessageViewController : UIViewController  - (instancetype)initWithMessage:(RCMMessage *)message; @property (nonatomic, strong) id &lt;RCMMessageService&gt; messageService;  @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041e\u0431\u044a\u0435\u043a\u0442 message \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 <i>TyphoonDefinition&#8217;\u043e\u0432<\/i> \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 <i>TyphoonAssembly<\/i> \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043b\u0435\u0442\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 <i>TyphoonAssembly<\/i> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 user story \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (UIViewController *)messageViewControllerWithMessage:(RCMMessage *)message<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (UIViewController *)messageViewControllerWithMessage:(RCMMessage *)message {     return [TyphoonDefinition withClass:[RCMMessageViewController class] configuration:^(TyphoonDefinition *definition) {     \t[definition useInitializer:@selector(initWithMessage:) parameters:^(TyphoonMethod *initializer) {         \t[initializer injectParameterWith:message];     \t}];             \t[definition injectProperty:@selector(messageService)                               with:[self.serviceComponents messageService]]; \t}]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412\u044b\u043d\u0435\u0441\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, <i>RCMMessageControllerFactory<\/i>, \u0438 \u043f\u0440\u043e\u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043c \u0435\u0433\u043e \u0432 \u0440\u043e\u0443\u0442\u0435\u0440:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (id&lt;RCMFoldersRouter&gt;)foldersRouter<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (id&lt;RCMFoldersRouter&gt;)foldersRouter {     return [TyphoonDefinition withClass:[RCMFoldersRouterBase class] configuration:^(TyphoonDefinition *definition) {     \t[definition injectProperty:@selector(messageControllerFactory)                               with:self]; \t}]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0440\u043e\u0443\u0442\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (void)showMessageViewControllerFromSourceController<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (void)showMessageViewControllerFromSourceController:(UIViewController *)sourceViewController                                       \twithMessage:(id &lt;RCMMessageReadableProtocol&gt;)message {     RCMMessageViewController *messageViewController = [self.messageControllerFactory messageViewControllerWithMessage:message]; \t... }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0438:  <\/p>\n<ul>\n<li>Runtime \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e <b>\u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/b>. \u041f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u0432 <i>NSValue<\/i>,<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0438\u0445 <b>\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f<\/b>,<\/li>\n<li>\u0421\u0442\u043e\u0438\u0442 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 <b>\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/b>. Runtime \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0438\u043d\u0430\u0447\u0435 \u043e\u043d\u0430 \u043d\u0435 \u0440\u0435\u0448\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4><b>Factory Definitions<\/b><\/h4>\n<p>  \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u0431\u044b\u0432\u0430\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c <i>TyphoonDefinition<\/i>, \u0443\u043c\u0435\u044e\u0449\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 definition&#8217;\u044b. \u041e\u0431\u044a\u044f\u0441\u043d\u044e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<p>  \u0417\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0430\u0432\u0430\u0442\u0430\u0440\u043e\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u2014 <i>RCMTextAvatarFactory<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@interface RCMTextAvatarFactory : NSObject<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>@interface RCMTextAvatarFactory : NSObject - (RCMTextAvatar *)avatarWithName:(NSString *)name; @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0410\u0432\u0430\u0442\u0430\u0440\u043a\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u044d\u0442\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u2014 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f definition \u0434\u043b\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0438:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (RCMTextAvatarFactory *)textAvatarFactory<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (RCMTextAvatarFactory *)textAvatarFactory {     return [TyphoonDefinition withClass:[RCMTextAvatarFactory class]]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f definition&#8217;\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u044d\u0442\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (RCMTextAvatar *)textAvatarForUserName:(NSString *)userName<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (RCMTextAvatar *)textAvatarForUserName:(NSString *)userName {     return [TyphoonDefinition withFactory:[self textAvatarFactory] selector:@selector(avatarWithName:) parameters:^(TyphoonMethod *factoryMethod) {     \t[factoryMethod injectParameterWith:userName]; \t}]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043b\u0430\u0432\u043d\u043e \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"http:\/\/sergeyteplyakov.blogspot.ru\/2013\/03\/di-service-locator.html\">\u0441\u0435\u0440\u0432\u0438\u0441-\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430<\/a>, \u0435\u0441\u043b\u0438 \u0432\u044b \u044d\u0442\u0438\u043c \u0433\u0440\u0435\u0448\u0438\u043b\u0438, \u043d\u0430 Typhoon. \u041f\u0435\u0440\u0432\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <i>TyphoonDefinition&#8217;\u043e\u0432<\/i> \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <i>factoryMethod&#8217;\u043e\u0432<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (id &lt;RCMMessageService&gt;)messageService<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (id &lt;RCMMessageService&gt;)messageService {     return [TyphoonDefinition withFactory:[self serviceLocator] selector:@selector(messageService)]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<h4><b>TyphoonInstancePostProcessor\/TyphoonDefinitionPostProcessor<\/b><\/h4>\n<p>  \u042d\u0442\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 assembly \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 definition\u2019\u043e\u0432.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <i>TyphoonInstancePostProcessor<\/i> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u043a\u043b\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c, \u0441\u043a\u0430\u0436\u0435\u043c, \u043a <i>networkService&#8217;\u0430\u043c<\/i>:<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440, \u0432\u044b\u0432\u043e\u0434\u044f\u0449\u0438\u0439 \u0432 \u043b\u043e\u0433 \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0443:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@interface RCMDecoratedService : NSProxy<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>@interface RCMDecoratedService : NSProxy + (instancetype)decoratedServiceWith:(NSObject &lt;RCMService&gt;*)service; @end  @interface RCMDecoratedService() @property (strong, nonatomic) NSObject &lt;RCMService&gt; *service; @end  @implementation RCMDecoratedService - (instancetype)initWithService:(NSObject &lt;RCMService&gt; *)service {     self.service = service;     return self; }  + (instancetype)decoratedServiceWith:(NSObject &lt;RCMService&gt;*)service {     return [[self alloc] initWithService:service]; }  - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {     return [self.service methodSignatureForSelector:sel]; }  - (void)forwardInvocation:(NSInvocation *)invocation {     NSLog(invocation.debugDescription); \t[invocation invokeWithTarget:self.service]; } @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b <i>TyphoonInstancePostProcessor<\/i> \u2014 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0438 \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@interface RCMLoggingInstancePostProcessor : NSObject &lt;TyphoonInstancePostProcessor&gt;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>@interface RCMLoggingInstancePostProcessor : NSObject &lt;TyphoonInstancePostProcessor&gt; @end  @implementation RCMLoggingInstancePostProcessor - (id)postProcessInstance:(id)instance {     if ([self isAppropriateInstance:instance]) {         RCMDecoratedService *decoratedService = [RCMDecoratedService decoratedServiceWith:instance];         return decoratedService; \t}     return instance; }  - (BOOL)isAppropriateInstance:(id)instance {     if ([instance conformsToProtocol:@protocol(RCMService)]) {         return YES; \t}     return NO; } @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u2014 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c <i>RCMLoggingInstancePostProcessor<\/i> \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 <i>TyphoonAssembly<\/i>. \u0421\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0436\u0438\u0432\u0435\u0442 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435. \u0415\u0433\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0436\u0438\u0437\u043d\u0438 <i>TyphoonComponentFactory<\/i>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">@implementation RCMApplicationAssembly<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>@implementation RCMApplicationAssembly - (id)loggingProcessor {     return [TyphoonDefinition withClass:[RCMLoggingInstancePostProcessor class]]; } ... @end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 Typhoon&#8217;\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <i>RCMLoggingInstancePostProcessor<\/i> \u2014 \u0430 \u0442\u0435 \u0438\u0437 \u043d\u0438\u0445, \u043a\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b <i>RCMService<\/i> \u2014 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <i>NSProxy<\/i>.<\/p>\n<p>  \u0414\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, <i>TyphoonDefinitionPostProcessor<\/i>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 definition&#8217;\u044b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u044e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 <i>TyphoonDefinition&#8217;\u044b<\/i>:  <\/p>\n<pre><code>- (void)postProcessDefinition:(TyphoonDefinition *)definition replacement:(TyphoonDefinition **)definitionToReplace withFactory:(TyphoonComponentFactory *)factory;<\/code><\/pre>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <i>TyphoonPatcher<\/i> \u0438 <i>TyphoonConfigPostProcessor<\/i>.<\/p>\n<h4><b>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/b><\/h4>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>XCTestExpectation<\/i>, Typhoon \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0435\u0441\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0445 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">&#8212; (void)testThatServiceSynchronizeMailBoxesList<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>- (void)testThatServiceSynchronizeMailBoxesList {     \/\/ given     NSInteger const kExpectedMailBoxCount = 4; \t[OHHTTPStubs stubRequestsPassingTest:REQUEST_TEST_YES                         withStubResponse:TEST_RESPONSE_WITH_FILE(@&quot;mailboxes_success&quot;)];     __block NSInteger resultCount;     __block NSError *responseError = nil;         \/\/ when \t[self.mailBoxService synchronizeMailBoxesWithCompletionBlock:^(NSError *error) {     \tresponseError = error;         NSFetchedResultsController *controller = [self.mailBoxService fetchedResultsControllerWithAllMailBoxes];     \tresultCount = controller.fetchedObjects.count; \t}];         \/\/ then \t[TyphoonTestUtils waitForCondition:^BOOL{         typhoon_asynch_condition(resultCount &gt; 0); \t} andPerformTests:^{         XCTAssertNil(responseError);         XCTAssertEqual(resultCount, kExpectedMailBoxCount); \t}]; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 timeout, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u2014 \u0441\u0435\u043c\u044c \u0441\u0435\u043a\u0443\u043d\u0434, \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0415\u0441\u043b\u0438 \u043e\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u2014 \u0442\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u0441\u044f \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c exception&#8217;\u043e\u043c. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0432\u043e\u0439 timeout:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TyphoonTestUtils wait:30.0f secondsForCondition:^BOOL<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>[TyphoonTestUtils wait:30.0f secondsForCondition:^BOOL{         typhoon_asynch_condition(resultCount &gt; 0); \t} andPerformTests:^{         XCTAssertNil(responseError);         XCTAssertEqual(resultCount, kExpectedMailBoxCount); }];<\/code><\/pre>\n<\/div>\n<\/div>\n<h4><b>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/b><\/h4>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Typhoon Framework \u2014 \u0430\u0432\u0442\u043e\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0445\u0435\u043b\u043f\u0435\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u043c\u0438 \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u0430\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0434\u0430\u0447 \u0431\u0435\u0437 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u043e\u0432, \u043f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u043e\u043d\u0438 \u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c.<\/p>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0446\u0438\u043a\u043b\u0430 \u043c\u044b \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Dependency Injection \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0434\u043b\u044f Cocoa \u2014 <a href=\"https:\/\/github.com\/atomicobject\/objection\">Objection<\/a> \u0438 <a href=\"https:\/\/github.com\/WayofTime\/BloodMagic\">BloodMagic<\/a>. \u041d\u0443 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u2014 \u043c\u044b \u0441 \u043c\u043e\u0438\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u043e\u0439 \u0413\u0435\u0440\u043c\u0430\u043d\u043e\u043c \u0421\u0430\u043f\u0440\u044b\u043a\u0438\u043d\u044b\u043c \u0432\u043e\u0448\u043b\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Typhoon, \u0442\u0430\u043a \u0447\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0442\u0430\u043b \u0435\u0449\u0435 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c.<\/p>\n<h4><b>\u0426\u0438\u043a\u043b \u00ab\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u00bb<\/b><\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/258325\/\">\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Typhoon<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/260355\/\">\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Typhoon<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/261537\/\">\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c Typhoon<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/rambler-co\/blog\/262999\/\">Typhoon Tips &#038; Tricks<\/a><\/li>\n<li>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b Typhoon<\/li>\n<li><i><a href=\"http:\/\/www.slideshare.net\/Rambler-iOS\/dependency-injection-ios\">(\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e) Rambler.iOS #3. Dependency Injection \u0432 iOS. \u0421\u043b\u0430\u0439\u0434\u044b<\/a><\/i><\/li>\n<li><i><a href=\"https:\/\/www.youtube.com\/watch?v=LO59z3fjc9k\">(\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e) Rambler.iOS #3. Dependency Injection \u0432 iOS. \u0412\u0438\u0434\u0435\u043e<\/a><\/i><\/li>\n<\/ul>\n<p>  <\/p>\n<h4><b>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/b><\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/appsquickly\/Typhoon\/issues\/178\">\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Autowire \u0432 Typhoon Framework<\/a><\/li>\n<li><a href=\"http:\/\/stackoverflow.com\/a\/4904533\">What is the difference between unit, functional, acceptance and integration tests?<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/235041\/\">NSProxy, \u043a\u0430\u043a \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0440\u0435\u0437\u0430\u0442\u044c \u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430\u0445<\/a><\/li>\n<li><a href=\"http:\/\/www.oodesign.com\/abstract-factory-pattern.html\">Abstract Factory Pattern<\/a><\/li>\n<li><a href=\"http:\/\/www.oodesign.com\/decorator-pattern.html\">Decorator Pattern<\/a><\/li>\n<li><a href=\"http:\/\/sergeyteplyakov.blogspot.ru\/2013\/03\/di-service-locator.html\">DI \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b. Service Locator<\/a><\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/264683\/\"> http:\/\/habrahabr.ru\/post\/264683\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t<img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ccd\/53f\/44f\/ccd53f44f24f4460ac23186eff422e06.jpg\"\/><\/p>\n<p>  <i>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0446\u0438\u043a\u043b\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b <b>Typhoon<\/b> \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u0445 \u0442\u0435\u043c, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/i>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-263495","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/263495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=263495"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/263495\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=263495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=263495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=263495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}