Skip to content

Propagating runtime arguments

Jasper Blues edited this page May 11, 2017 · 13 revisions

Propagating run-time arguments through to dependencies

We can propagate a runtime argument through to a dependency as shown:

- (id)loyaltyManagementControllerWithLoyaltyAccounts:(NSArray *)loyaltyAccounts
{
    return [TyphoonDefinition withClass:[LoyaltyManagementViewController class] 
        configuration:^(TyphoonDefinition* definition) {
        [definition useInitializer:@selector(initWithLoyaltyClient:view:) 
            parameters:^(TyphoonMethod* initializer) {

            [initializer injectParameterWith:[_networkComponents loyaltyClient]];
            [initializer injectParameterWith:
                [self loyaltyManagementViewWithAccounts:loyaltyAccounts]];
        }];
    }];
}

- (id)loyaltyManagementViewWithAccounts:(NSArray*)loyaltyAccounts
{
    return [TyphoonDefinition withClass:[LoyaltyManagementView class] 
        configuration:^(TyphoonDefinition* definition) {

        //The loyaltyAccounts parameter is propagated through the parent controller
        // onto the view
        [definition injectMethod:@selector(setLoyaltyAccounts:) 
            parameters:^(TyphoonMethod* method) {

            [method injectParameterWith:loyaltyAccounts];
        }];
}

Using runtime arguments with circular dependencies

Often, as is the case with a controller and a view's delegate we have a circular dependency. Circular dependencies are supported with run-time arguments. Here's an example:

- (id)loyaltyManagementControllerWithAccounts:(NSArray*)loyaltyAccounts
{
    return [TyphoonDefinition withClass:[LoyaltyManagementViewController class] configuration:^(TyphoonDefinition* definition) {

        [definition useInitializer:@selector(initWithLoyaltyClient:view:) 
            parameters:^(TyphoonMethod* initializer) {            
            [initializer injectParameterWith:[_networkComponents loyaltyClient]];
            [initializer injectParameterWith:
                [self loyaltyManagementViewWithAccounts:loyaltyAccounts]];
        }];
    }];
}

- (id)loyaltyManagementViewLoyaltyAccounts:(NSArray*)loyaltyAccounts
{
    return [TyphoonDefinition withClass:[LoyaltyManagementView class] 
        configuration:^(TyphoonDefinition* definition) {

        [definition injectProperty:@selector(delegate)
            with:[self loyaltyManagementControllerWithAccounts:loyaltyAccounts]];
    }];
}