-[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")
}
Это, похоже, работает, конечно. Но если это нужно сделать так, то метод фундаментально испорчен. Сигналы живут до тех пор, пока не появится ссылка на них. Если сигнал отпускается, тогда он должен быть удален, что, в свою очередь, удаляет наблюдателя. Вы можете посмотреть вокруг в своем коде, может быть сильная ссылка на сигнал, который не позволяет ему освободиться. Или, если это не так, пожалуйста, сообщите о проблеме проекту, поскольку это, по моему мнению, не является ожидаемым поведением. – allprog
@allprog [Подписчики сохраняют свои сигналы] (https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/MemoryManagement.md) до завершения, ошибки или удаления. Вот почему бесконечные сигналы могут быть довольно грубыми. '-takeUntil:' это хорошее решение или что-то подобное, которое детерминистически завершает сигнал в определенной точке. –
@ JustinSpahr-Summers Спасибо за разъяснение. Я знал, что я слишком хочу кричать волка! Но ты должен меня исправить. :) Может ли документация содержать эти тонкости? Например. «это бесконечный сигнал» и дать указатель на некоторое описание, которое показывает, что нужно учитывать. Я буду честен, у структуры, похоже, есть некоторые из этих «ловушек-ловушек», и было бы лучше, если бы были подчеркнуты особенности возвращаемого сигнала в этих случаях. – allprog