ReactiveCocoa是解雇RACSignal的首选方式

时间:2015-03-26 02:22:46

标签: reactive-cocoa

我希望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,但第二个例子更容易理解。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用takeUntil运算符并传入self.rac_willDeallocSignal来模仿您在第二个示例中编写的dealloc方法。一般来说,我认为除了最边缘的情况外,最好避免RACSubject。我对RAC没有太多经验,但我推荐关于“RACifying non RAC code”的YouTube视频(它是在Rith播放列表的Github频道上)。

另外,只是关于RAC的说明,我很确定有一个空subscribeNext块是不好的形式,因此您可能希望将[self onSilentAPNSNotification]移出flattenMap进入subscribeNext区块。