2015-09-07 23 views
0

我有3個相關信號,我想將它們的值組合到一個對象中。我想出了2個選項。鏈接相關信號並組合它們的值

選項1:

+ (RACSignal *)createObject { 
    RACSignal *paramsSignal = [[[self class] createObject1] flattenMap:^RACStream *(NSString *object1) { 
     return [[[self class] createObject2:object1] flattenMap:^RACStream *(NSString *object2) { 
      return [[[self class] createObject3:object2] flattenMap:^RACStream *(NSString *object3) { 
       return [RACSignal return:RACTuplePack(object1, object2, object3)]; 
      }]; 
     }]; 
    }]; 

    return [paramsSignal map:^id(RACTuple *tuple) { 
     return [[CombinedObject alloc] initWithO1: tuple.first O2: tuple.second O3: tuple.third]; 
    }]; 
} 

我不太喜歡所有的嵌套和關閉。

選項2:

+ (RACSignal *)createObject { 
    RACSignal *paramsSignal = [[[[self class] createObject1] flattenMap:^id(NSManagedObjectModel *object1) { 
     return [RACSignal combineLatest:@[[RACSignal return:object1], [[self class] createObject2:object1]]]; 
    }] flattenMap:^RACStream *(RACTuple *tuple) { 
     return [RACSignal combineLatest:@[[RACSignal return:tuple.first], [RACSignal return:tuple.second], [[self class] createObject3:tuple.second]]]; 
    }]; 


    return [paramsSignal map:^id(RACTuple *tuple) { 
     return [[CombinedObject alloc] initWithO1: tuple.first O2: tuple.second O3: tuple.third]; 
    }]; 
} 

沒有嵌套或關門,而是太多的元組和對象通過每個信號的...

所以我想知道是否有更好的解決方案,我不存在。

謝謝。

回答

0

堆棧式方法如何?

- (NSArray *) createPhases { 
    return @[@selector(createObject1:), @selector(createObject2:), @selector(createObject3:)]; 
} 

... 


+ (RACSignal *)createObject { 

    NSMutableArray *stack = [NSMutableArray new]; 
    for (SEL phase: [self createPhases]) { 
     stack = [[[self class] performSelector:phase withObject:stack] flattenMap:^RACStream *(NSString *append) { 
      return [stack arrayByAddingArray:@[append]]; // or with some other manipulations 
     }]; 
    } 


    return [self withObjects:stack map:^id(NSArray *stack) { 
     return [[CombinedObject alloc] initWithObjects:stack]; 
    }]; 
} 

- (...) createObject1:(NSArray *)chain { 
    // here chain will be empty, actually (@[]) 

    return ... // create object 1 
} 

- (...) createObject2:(NSArray *)chain { 
    // here chain will be @[object1] 

    return [... ... withObject1:[chain lastObject]]; // create object 2 
} 

- (...) createObject3:(NSArray *)chain { 
    // here chain will be @[object1, object2] 

    return [... ... withObject2:[chain lastObject]]; // create object 3 
} 
相關問題