RACSignal:为什么使用rac_textSignal“延迟”将RACSignal返回给自己?

时间:2015-05-31 16:51:44

标签: ios reactive-cocoa

rac_textSignal-Implementation使用“defer”在“self”上返回RACSignal。 这是什么原因?

这是实施:

- (RACSignal *)rac_textSignal {
    @weakify(self);
    return [[[[[RACSignal
        defer:^{
            @strongify(self);
            return [RACSignal return:self];
        }]
        concat:[self rac_signalForControlEvents:UIControlEventEditingChanged]]
        map:^(UITextField *x) {
            return x.text;
        }]
        takeUntil:self.rac_willDeallocSignal]
        setNameWithFormat:@"%@ -rac_textSignal", [self rac_description]];
}

3 个答案:

答案 0 :(得分:3)

延迟信号和连接信号都发送UITextField s(有效self)。

延迟信号使返回的信号在订阅时发送当前存储的文本,因为[self rac_signalForControlEvents:UIControlEventEditingChanged]仅发送更改。

答案 1 :(得分:1)

如果你要省略推迟并实施它,如:

- (RACSignal *)rac_textSignal {
    @weakify(self);
    return [[[[[RACSignal return:self]
            concat:[self rac_signalForControlEvents:UIControlEventEditingChanged]]
            map:^(UITextField *x) {
                return x.text;
            }]
            takeUntil:self.rac_willDeallocSignal]
            setNameWithFormat:@"%@ -rac_textSignal", [self rac_description]];
 }

我仍然不完全理解RAC内存管理,但是,在上面的实现中,您的信号将强烈引用self,永远不会完成,您将最终得到zombie {{ 1}}。

答案 2 :(得分:0)

我认为推迟只是为了防止保留周期