日々精進

新しく学んだことを書き留めていきます

複数のSetterから一つのプロパティに値をセットできる場合の注意点

以下のように複数のsetterからvalueプロパティに値を代入できる場合。

@interface PropertyViewModel : NSObject
@property(nonatomic, strong) NSString *key;
@property(nonatomic, strong) NSString *value;

- (NSInteger)integerValue;
- (void)setIntegerValue:(NSInteger)value;
@end

@implementation PropertyViewModel
- (NSInteger)integerValue {
    return self.value.integerValue;
}

- (void)setIntegerValue:(NSInteger)value {
    [self willChangeValueForKey:@"integerValue"];
    self.value = @(value).stringValue;
    [self didChangeValueForKey:@"integerValue"];
}
@end

以下のようにintegerValueの変更を監視するとsetIntegerValueを経由せず変更した場合に変更が通知されない。

    [[RACAbleWithStart(property, integerValue) distinctUntilChanged] subscribeNext:^(id x) {
        ....
    }];
    property.value = @"test";

必ず大元のvalueプロパティを監視すること。
そうすると[self willChangeValueForKey:@"integerValue"];とかもいらないな。。

    [[RACAbleWithStart(property, value) distinctUntilChanged] subscribeNext:^(id x) {
        ....
    }];
    property.value = @"test";