Я хочу, чтобы 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, но второй пример легче понять. есть идеи?
takeUntil
и передатьself.rac_willDeallocSignal
, чтобы имитировать методdealloc
, который вы написали во втором примере. Кроме того, просто примечание о RAC, я почти уверен, что иметь пустой блокsubscribeNext
дурной тон, поэтому вы, вероятно, захотите переместить[self onSilentAPNSNotification]
из блокаflattenMap
в блокsubscribeNext
. - person hhanesand   schedule 09.04.2015