【问题标题】:Dynamic OneToMany ReactiveCocoa binding动态 OneToMany ReactiveCocoa 绑定
【发布时间】:2017-10-28 09:26:47
【问题描述】:

我的代码中有类似于以下结构的内容:

// 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)并且每个孩子的位置也可以改变。 p>

ReactiveCocoa 中是否存在任何优雅的解决方案来将模型中的子位置的动态数量映射到 FatherViewModel 中的 averagePositionOfChildren?

【问题讨论】:

    标签: objective-c reactive-cocoa reactive-cocoa-3


    【解决方案1】:

    是的,我可以看到你选择了两种策略:

    1.使用属性

    children 使用MutableProperty,然后为averagePositionOfChildren 创建一个映射属性。

    2。使用 KVO

    或者,您可以使用 KVO 来观察 children 中的变化。即,您可以创建一个DynamicProperty

    请注意,这两种情况都会迫使您重新创建整个数组,正如您已经指出的那样。

    【讨论】:

      【解决方案2】:

      如果有人有兴趣,这里遵循我自己的解决方案:

      @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
      

      【讨论】:

        猜你喜欢
        • 2014-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        相关资源
        最近更新 更多