Objective c 如何使用Typhone将运行时参数传递给子组件?

Objective c 如何使用Typhone将运行时参数传递给子组件?,objective-c,typhoon,Objective C,Typhoon,假设我有两门课:Foo和Bar。我可以独立于Foo构建一个Bar,但是Foo需要一个Bar。在Typhone中,我定义了这两个组件,并在我的应用程序中使用它们。然而,在运行时,当构造一个Foo时,我传入的barId似乎作为一个而不是我传入的NSString传递给另一个Bar组件 我可能做错了 我应该怎么做 @implementation Assembly -(Foo *)fooWithFooId:(NSString *)fooId andBarId:(NSString *)barId {

假设我有两门课:Foo和Bar。我可以独立于Foo构建一个Bar,但是Foo需要一个Bar。在Typhone中,我定义了这两个组件,并在我的应用程序中使用它们。然而,在运行时,当构造一个Foo时,我传入的barId似乎作为一个而不是我传入的NSString传递给另一个Bar组件

我可能做错了

我应该怎么做

@implementation Assembly

-(Foo *)fooWithFooId:(NSString *)fooId andBarId:(NSString *)barId {
  return [TyphoonDefinition withClass:[Foo class] configuration:^(TyphoonDefinition* definition) {
    [definition useInitializer:@selector(initWithFooId:andBar:) parameters:^(TyphoonMethod *initializer) {
        [initializer injectParameterWith:fooId];
        [initializer injectParameterWith:[self barWithId:barId]];
    }];
  }];
}

-(Bar *)barWithBarId:(NSString *)barId {
  return [TyphoonDefinition withClass:[Bar class] configuration:^(TyphoonDefinition* definition) {
    [definition useInitializer:@selector(initWithBarId:) parameters:^(TyphoonMethod *initializer) {
      [initializer injectParameterWith:barId];
    }];
  }];
}

@end

////////

@implementation Foo

-(instancetype) initWithFooId:(NSString *)fooId andBar:(Bar *)bar
{
  self = [super init];
  self.fooId = fooId;
  self.bar = bar;
  return self;
}

@end

@implementation Bar

-(instancetype) initWithBarId:(NSString *)barId
{
  self = [super init];
  self.barId = barId;
  return self;
}

@end
更新: 进一步检查后,问题似乎是由于在定义中使用运行时参数为另一个定义构建另一个参数引起的。请参见下面NSString的用法:


调用时,传递到初始值设定项中的路径将是/some/path/to/baz/

您如何获得Foo的构建实例?上面的汇编代码看起来不错,但请记住以下几点:

生成时:程序集返回typhondefinition的实例。Typhone检测此程序集以收集它在运行时返回生成实例所需的信息。这包括将运行时参数注入TyphoninjectionByRuntimeArgument的代理实例。 运行时:程序集现在根据定义中定义的规则返回生成的组件。它实际上是一个指向TyphonComponentFactory的代理。 创建一个或多个程序集后,需要执行以下操作才能使程序集返回生成的零部件:

- (void)testFoobar
{
    //Pass in a not-built assembly to TyphoonComponentFactory
    TyphoonComponentFactory *factory =
        [TyphoonBlockComponentFactory factoryWithAssemblies:@[[Assembly assembly]]]; 

    //Now we have a built assembly
    Assembly *builtAssembly = (Assembly*) factory;

    Foo *builtFoo = [builtAssembly fooWithFooId:@"1234" andBarId:@"5678"];
    NSLog(@"%@", builtFoo);
}
结果:

或者,对于应用程序,您可以使用plist集成来引导和注入应用程序委托。请注意,您可以将程序集本身注入任何组件中,无论是作为TyphonComponentFactory还是作为一个程序集接口。这对于从一个对象图(如视图控制器)过渡到另一个对象图非常有用

编辑:

虽然这不是最初的意图,但在大多数情况下,您也可以在程序集中使用运行时参数,我们现在在自己的应用程序中这样做。例如:

- (OfferManager *)offerManager
{
    return [TyphoonDefinition withClass:[OfferManager class] 
        configuration:^(TyphoonDefinition *definition) {
        [definition useInitializer:@selector(initWithEngine:) 
            parameters:^(TyphoonMethod *initializer) {

            [initializer injectParameterWith:
                [self engineWithPollingInterval:@120 cacheExpire:@3600]];
        }];
    }];
}
。但目前不可能创建一个顶级定义,该定义是另一个具有运行时参数的定义的结果。例如:

- (Engine*) preConfiguredEngine {
    return [self engineWithPollingInterval:@120 cacheExpire:@3600];
} 

。原因很简单,如果你需要这个,我们可以看看

还要注意,Typhone的早期版本没有将运行时参数传播给子级。你是最新的2.3.2吗?是的,我们是最新的。我现在注意到,我们的问题可能在于我们对传入参数在运行时的工作方式的理解。我们在方法定义中使用NSString stringWithFormat构建了一个字符串,该字符串在运行时没有执行,但我猜是在组件生命周期的早期构建的。在大多数情况下,您可以这样做-在程序集中使用运行时参数。但目前无法从顶级定义中删除。请参见编辑。你需要这个吗?如果您提出问题,我们可以查看。@RyanMontgomery请参阅编辑。如果我理解正确,你想做什么可以在几个小时内得到支持。我刚刚更新了问题,包括一个更新和更好的解释。如果能像我描述的那样做就好了。我们的目的是将依赖关系推送到配置中。我们还有一个例子,在尝试构建和传递NSPredicate时,由于类似的原因失败。它遇到了同样的问题。
- (Engine*) preConfiguredEngine {
    return [self engineWithPollingInterval:@120 cacheExpire:@3600];
}