我希望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,但第二个例子更容易理解。有什么想法吗?
答案 0 :(得分:0)
您可以使用takeUntil
运算符并传入self.rac_willDeallocSignal
来模仿您在第二个示例中编写的dealloc
方法。一般来说,我认为除了最边缘的情况外,最好避免RACSubject
。我对RAC没有太多经验,但我推荐关于“RACifying non RAC code”的YouTube视频(它是在Rith播放列表的Github频道上)。
另外,只是关于RAC的说明,我很确定有一个空subscribeNext
块是不好的形式,因此您可能希望将[self onSilentAPNSNotification]
移出flattenMap
进入subscribeNext
区块。