3

Node を基本クラスとするツリーベースのデータ構造があります。

@interface Node : NSObject
@property (nonatomic, weak) Node *parentNode;
@property (nonatomic, assign) BOOL detached;
@end

親のノードの切り離された変数が YES の場合、子の同じプロパティが YES になる必要があります。この動作は、次のコードでモデル化されています。

@implementation Node

- (void)setParentNode:(Node *)parentNode {
    _parentNode = parentNode;
    RAC(self, detached) = [RACObserve(_parentNode, detached) filter:^BOOL(id value) {
        return [value boolValue];
    }];
}

@end

親が変更されているときに、切り離されたプロパティを再バインドするにはどうすればよいですか? その場合、何もしないとクラッシュします。

Node *node = [Node new];
Node *parentNode = [Node new];
Node *grandparentNode = [Node new];
parentNode.parentNode = grandparentNode;
node.parentNode = parentNode;
[RACObserve(node, detached) subscribeNext:^(id x) {
    NSLog(@"node.detached: %@", x);
}];
Node *newParent = [Node new];
node.parentNode = newParent;
grandparentNode.detached = YES;

ここで議論を見つけましたが、私の場合に解決策を採用する方法を理解できません。

4

1 に答える 1

9

一般的な経験則として、セッター内でシグナルを構築することは避けてください。これは不必要に必須であり、RAC は、実行しようとしていることを (どのように実行するではなく)表現するための、より多くの宣言的な方法を提供します。

したがって、何かを に入れる代わりに、-setParentNode:初期化時に独自のプロパティにバインドできます (たとえば)。

- (id)init {
    self = [super init];
    if (self == nil) return nil;

    // Use @NO instead if that makes more sense as a default.
    RAC(self, detached, @YES) = [RACObserve(self, parentNode.detached) filter:^(NSNumber *detached) {
        return [detached boolValue];
    }];

    return self;
}

これは、または変更さself.detachedれるたびに更新されます。の場合、プロパティはデフォルトで になります。self.parentNodeself.parentNode.detachedself.parentNodenilYES

于 2013-10-10T22:15:44.127 に答える