Подтвердить что ты не робот

Как создать абонент ReactiveCocoa, который получает сигнал только один раз, а затем отписывает/освобождает себя?

Сейчас я регистрирую подписчика на сигнал свойства следующим образом:

[RACAble(self.test) subscribeNext:^(id x) {
        NSLog(@"signal fired!");
 }];

Функциональность по умолчанию состоит в том, что она запускает каждый раз, когда self.test изменяется, но я просто хочу, чтобы он срабатывал один раз, а затем отменил подписку. Есть ли один аргумент или модификатор, который я могу передать в RAC при создании этого подписчика?

4b9b3361

Ответ 1

[[RACAble(self.test) take:1] subscribeNext:^(id x) {
    NSLog(@"signal fired!");
}];

Ответ 2

Это может быть полезно, особенно если вы создаете вложенные подписки:

RACDisposable *subscription = [RACObserve(self, test) subscribeNext:^(id x) {
         NSLog(@"signal fired!");
}];
[subscription dispose];

Ответ 3

Небольшое исправление kamil3 ответ:

__block RACDisposable *subscription = [RACObserve(self, test) subscribeNext:^(id x) {
    [subscription dispose];
    NSLog(@"signal fired!");
}];

Ответ 4

вы также можете это сделать (если вы не находитесь в целом краткости вещь):

[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber){
   RACDisposable *inner_disposer = [RACAble(self.test) subscribeNext:^(id x){
      [subscriber sendNext:x];
      [subscriber sendComplete];
   }];
   return [RACDisposable disposableWithBlock:^{
      [inner_disposer dispose];
   }];
}];