Ios 台风带单粒子
我正在使用带有“Plist集成”的Typhone 我在程序集中定义了Ios 台风带单粒子,ios,objective-c,iphone,dependency-injection,typhoon,Ios,Objective C,Iphone,Dependency Injection,Typhoon,我正在使用带有“Plist集成”的Typhone 我在程序集中定义了AppDelegate,如下所示: - (AppDelegate *)appDelegate { return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(window)];
AppDelegate
,如下所示:
- (AppDelegate *)appDelegate {
return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(window)];
definition.scope = TyphoonScopeSingleton;
}];
}
在窗口中
,我有一个rootViewController
和一个委托
,它由AppDelegate
实现
- (RootViewController *)rootViewController {
return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(delegate)];
}];
}
问题是,委托
是用另一个AppDeleaate
实例设置的。我在AppDelegate
init
中设置了一个断点,实际上它被调用了两次
我知道一个解决方案是在运行时在AppDelegate
内手动设置delegate
,但我希望这由Typhone处理
注意:我还没有尝试过,但同样的情况也可能发生在由故事板创建的视图控制器上。好问题
台风没有注入您的初始AppDelegate,因为它是在台风之外创建的。Typhone具有Internal对象池,它们用于注入到另一个对象中,如果Typhone在池中没有对象,则将使用指定的初始值设定项创建该对象(如果作用域为singleton,则保留该对象)
从故事板创建的ViewController将正确注入,因为它们是在Typhone中创建的
要解决您的特定问题,请尝试以下AppDelegate定义:
- (AppDelegate *)appDelegate {
return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) {
[definition setFactory:[self sharedApplication]];
[definition useInitializer:@selector(delegate)];
[definition injectProperty:@selector(window)];
definition.scope = TyphoonScopeSingleton;
}];
}
- (UIApplication *)sharedApplication {
return [TyphoonDefinition withClass:[UIApplication class] configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(sharedApplication)];
}];
}
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
// load up any environment variables/injections
definition.injectProperty("assembly", with: self)
definition.injectProperty("window", with: UIWindow(frame: UIScreen.mainScreen().bounds))
definition.scope = TyphoonScope.LazySingleton
}
然后在解析appDelegate
定义时,Typhone将调用[[UIApplication sharedApplication]delegate]
方法,并在Typhone中注册返回的实例
这样,AppDelegate将只创建一次(由UIApplication创建)。。但注入将应用两次(一次在启动期间,第二次在第一次解析appDelegate定义时)
更新
AppDelegate
案例已在台风内部修复。您的原始代码现在可以使用了(使用head
版本或在将来的版本中)。这似乎在8.4中又被破坏了
在进行Typhone plist集成时,您将得到2个AppDelegate。一个由UIApplication创建,一个由Typhone管理
我改变了当前台风文档中创建appDelegate的方式:
- (AppDelegate *)appDelegate {
return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) {
[definition setFactory:[self sharedApplication]];
[definition useInitializer:@selector(delegate)];
[definition injectProperty:@selector(window)];
definition.scope = TyphoonScopeSingleton;
}];
}
- (UIApplication *)sharedApplication {
return [TyphoonDefinition withClass:[UIApplication class] configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(sharedApplication)];
}];
}
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
// load up any environment variables/injections
definition.injectProperty("assembly", with: self)
definition.injectProperty("window", with: UIWindow(frame: UIScreen.mainScreen().bounds))
definition.scope = TyphoonScope.LazySingleton
}
按照你的答案去做
这修复了2x AppDelegate的问题,但留下了鸡和蛋的问题;具体来说,AppDelegate是在通过plist创建程序集之前由UIApplication创建的。因此,如果您的视图控制器由Typhone管理,而不是通过故事板管理,则在appDelegate的didFinishLaunchingWithOptions设置阶段,它们将不存在
为了解决这个问题,我最终使Typhone程序集成为一个普通的单例程序集,并删除了plist集成
我希望这能帮助人们解决同样的问题