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

Как использовать Reactive Cocoa с уведомлениями

Как я могу создать сигнал из имени уведомления? Например, я хочу перейти от:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(userDidChange:)
                                             name:kTTCurrentUserLoggedOffNotification
                                           object:nil];

к чему-то вроде:

[signalForName(kTTCurrentUserLoggedOffNotification) subscribeNext:^(id x){
...
}];
4b9b3361

Ответ 1

-[NSNotificationCenter rac_addObserverForName:object:] возвращает бесконечный сигнал. Вы можете подписаться на него следующим образом

Objective-c

[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil]
  takeUntil:[self rac_willDeallocSignal]]
  subscribeNext:^(id x) {
     NSLog(@"Notification received");
}];

Swift

NSNotificationCenter.defaultCenter()
  .rac_addObserverForName(UIKeyboardWillShowNotification, object: nil)
  .takeUntil(self.rac_willDeallocSignal())
  .subscribeNext { (_) in
     print("Notification received")
  }

Этот сигнал как указано бесконечно. Если вам нужен этот сигнал/подписка для привязки к времени жизни self, вы можете добавить takeUntil: с помощью rac_willDeallocSignal следующим образом:

Objective-c

[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil]
  takeUntil:[self rac_willDeallocSignal]]
  subscribeNext:^(id x) {
     NSLog(@"Notification received");
}];

Swift

NSNotificationCenter.defaultCenter()
  .rac_addObserverForName(UIKeyboardWillShowNotification, object: nil)
  .takeUntil(self.rac_willDeallocSignal())
  .subscribeNext { (_) in
     print("Notification received")
  }

Ответ 2

В RACExtensions вы можете найти категорию NSNotificationCenter (RACSupport). У этого есть метод для этой цели:

- (RACSignal *)rac_addObserverForName:(NSString *)notificationName
                               object:(id)object;

Ответ 3

Swift с помощью ReactiveCocoa 4.1:

NSNotificationCenter.defaultCenter()
      .rac_addObserverForName(UIKeyboardWillShowNotification, object: nil)
      .takeUntil(self.rac_willDeallocSignal())
      .subscribeNext { (_) in
          print("UIKeyboardWillShowNotification")
      }