ReactiveCocoa предпочтительный способ запуска RACSignal

Я хочу, чтобы RACSignal срабатывал при какой-либо внешней активности, например: уведомление о молчаливом APNS. Я могу добиться этого с помощью rac_signalForSelector следующим образом:

- (id) init {

if ((self = [super init])) {
    [self rac_signalForSelector:@selector(silentAPNS)]
    flattenMap:^RACStream *(id value) {
        // Perform some activity
         [self onSilentAPNSNotification];
      }]
      subscribeNext:^(id x) {
    }]; 
}
 return self;
}

- (void) silentAPNS {
 NSLog(@“silent apns called”);
}


-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

   [self silentAPNS];
}

Хотя приведенное выше работает, может быть сложно следовать коду, особенно потому, что сам метод SilentAPNS мало что делает.

Вместо этого я могу объявить свойство RACSubject и отправить ему сообщение следующим образом.

@property(nonatomic, strong) RACSubject * silentAPNSSignal;
- (id) init {

    if ((self = [super init])) {
      self.silentAPNSSignal = [RACSubject subject];
      [self.silentAPNSSignal
         flattenMap:^RACStream *(id value) {
        // Perform some activity
         [self onSilentAPNSNotification];
      }]
      subscribeNext:^(id x) {
    }]; 
}
 return self;
}

- (void) dealloc {
  [self.silentAPNSSignal sendCompleted];
}

- (void) silentAPNS {
  NSLog(@“silent pans called”);
  [self.silentAPNSSignal sendNext:nil];
}

В документе не рекомендуется использовать RACSubject, но второй пример легче понять. есть идеи?


person Anshu Gupta    schedule 26.03.2015    source источник
comment
Вы можете использовать оператор takeUntil и передать self.rac_willDeallocSignal, чтобы имитировать метод dealloc, который вы написали во втором примере. Кроме того, просто примечание о RAC, я почти уверен, что иметь пустой блок subscribeNext дурной тон, поэтому вы, вероятно, захотите переместить [self onSilentAPNSNotification] из блока flattenMap в блок subscribeNext.   -  person hhanesand    schedule 09.04.2015


Ответы (1)


Вы можете использовать оператор takeUntil и передать self.rac_willDeallocSignal, чтобы имитировать метод dealloc, который вы написали во втором примере. В общем, я думаю, что лучше избегать RACSubject во всех случаях, кроме самых крайних. Я не слишком разбираюсь в RAC, но я рекомендую видео на YouTube «RACifying non RAC code» (оно есть на канале Github в их плейлисте RAC).

Кроме того, просто примечание о RAC, я почти уверен, что иметь пустой блок subscribeNext дурной тон, поэтому вы, вероятно, захотите переместить [self onSilentAPNSNotification] из блока flattenMap в блок subscribeNext.

person hhanesand    schedule 09.04.2015