2017-05-27 7 views
0

を結合:実行時にダイナミックOneToMany ReactiveCocoaが、私は私のコードでは、以下の構造に似て何か持って

// Model 
@interface Child : NSObject 
@property (nonatomic, assign) CGPoint position; 
@end 

@interface Father : NSObject 
@property (nonatomic, strong) NSArray <Child *> *children; // (0..n) 
@end 

// ViewModel 
@interface FatherViewModel : NSObject 
@property (nonatomic, strong) Father *father; 
@property (nonatomic, assign) CGPoint averagePositionOfChildren; 
@end 

を、各父のメンバーの子供の数は(このケースでは、私は全体にNSArrayを再作成)に変更することができます各子のの位置もに変更できます。

ReactiveCocoaのエレガントなソリューションは、モデルの子の位置の動的数をFatherViewModelのaveragePositionOfChildrenにマッピングするために存在しますか?

答えて

0

はい、私はあなたが2つの戦略を選択見ることができます:childrenためMutablePropertyを使用して、averagePositionOfChildrenためにマッピングされたプロパティを作成

1.プロパティ

を。

2. KVOまた

、あなたはchildrenの変化を見るためにKVOを使用することができます。つまり、DynamicPropertyを作成することができます。

すでに説明したように、どちらのシナリオでもアレイ全体を再作成する必要があることに注意してください。

0

誰もが興味を持っている場合は、ここでは自分のソリューションを、次のとおりです。

@interface FatherViewModel() 
@property (nonatomic, strong) RACDisposable *averageBindingDisposable; 
@end 

@implementation FatherViewModel 
- (instanceType) init { 
self = [super init]; 
... 
... 
RACSignal *signalOfSignals = [RACObserve(self, father.children) 
         map:^RACSignal *(NSArray <Child *> *setOfChildren) { 
          NSArray <RACSignal *> *arrayOfSignal = [[[setOfChildren rac_sequence] 
                     map:^RACSignal *(Child *child) { 
                      return RACObserve(child, position); 
                     }] 
                    array]; 
          return [RACSignal combineLatest:arrayOfSignal]; 
         }]; 

[self.averageBindingDisposable dispose]; 
self.averageBindingDisposable = [[[signalOfSignals flatten] 
        map:^NSValue *(RACTuple *tuple) { 
         NSArray <NSValue *> *arrayOfWrappedCGPoints = tuple.allObjects; 
         CGPoint avg = CGPointZero; 
         // Compute here the average of the points in the array 
         return [NSValue valueWithPoint: avg]; 
        }] 
        setKeyPath:@"averagePositionOfChildren" onObject: self]; 
}]; 

return self; 
} 
... 
@end 
関連する問題