2015-05-31 2 views
4

rac_textSignal-Implementation использует «defer» для возврата RACSignal на «self». В чем причина этого?RACSignal: Зачем использовать rac_textSignal «defer» для возврата 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

И отложенный сигнал и каскадный сигнал отправки UITextField с (эффективно self).

Отложенный сигнал заставляет возвращенный сигнал отправлять текущий сохраненный текст по подписке, поскольку [self rac_signalForControlEvents:UIControlEventEditingChanged] отправляет только изменения.

+0

Почему отсрочка необходима? – itinance

+1

Скорее всего, он поместится в слабительном/укрепляющем танце. Edit: Похоже, Jakub пришел к такому же выводу. – Simon

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, не будет когда-либо закончите, и вы получите зомби UITextField.

0

Я думаю, что отсрочка только для предотвращения цикла удержания

Смежные вопросы