¿Cuál es el uso correcto de NSNotificationCenter con ReactiveCocoa 3 y Swift?

Estoy jugando alnetworkingedor de ReactiveCocoa 3 y Swift y decidí hacer una aplicación de juguete simple para probar cómo diseñar una aplicación con ReactiveCocoa 3 que implemente el patrón MVVM.

El personal básico funciona bastante bien, pero no estoy seguro de cuál es la mejor manera de manejar las señales creadas desde un centro de notifications.

Digamos que alguien está activando una notificación en algún lugar de la aplicación. La notificación se denomina TimerNotification y tiene un object de time Int dentro del dictionary de información del usuario al que se puede acceder mediante la tecla TimerCount . Ahora diga que tengo un controller que quiere imprimir un post cada vez que se activa un TimerNotification .

En el antiguo ObjC / RAC 2 días haría algo como esto

 - (void)viewDidLoad { NSNotificationCenter * notificationCenter = [NSNotificationCenter defaultCenter]; RACSignal * timerSignal = [[notificationCenter rac_addObserverForNotificationName:@"TimerNotification" object:nil] takeUntil:self.rac_willDeallocSignal]; [timerSignal subscribeNext:^(NSNotification * notification){ NSValue * timerCount = notification.userInfo[@"TimerCount"]; NSLog(@"Timer count is %@", timerCount); }]; } 

Eso me asegurará que cuando el controller sea desasignado, la suscripción será eliminada.

Mi primer bash de hacer algo similar en el mundo Swift / RAC 3 fue

 private func createTimerSignalProducer() -> SignalProducer<Int, NoError> { let notificationCenter = NSNotificationCenter.defaultCenter() let deallocSignalProducer = self.rac_willDeallocSignal().toSignalProducer() |> map { _ in () } |> catch { _ in SignalProducer.empty as SignalProducer<(), NoError> } return notificationCenter.rac_notifications(name: "TimerNotification") |> map { $0.userInfo!["TimerCount"] as! Int } |> takeUntil(deallocSignalProducer) } 

y luego dentro de viewDidLoad haría

 createTimerSignalProducer() |> start { count in println("Timer trigger for the \(count) time") } 

Eso realmente funcionó pero qué pasa si quieres hacer algo similar en un object que no henetworkinge de NSObject. Porque en un object Swift regular no obtienes rac_willDeallocSignal() .

Una posible solución es almacenar el desechable en una variable de instancia y luego desecharlo en el deinit pero me gustaría evitar el manejo manual de los desechables.

ACTUALIZAR

Lo que terminé haciendo (porque el object Swift no tiene un object raíz) fue

 public protocol ViewModel { } public class BaseViewModel: ViewModel { private let deinitSignalProducerSinkPair = SignalProducer<(), NoError>.buffer() public var deinitSingalProducer: SignalProducer<(), NoError> { return deinitSignalProducerSinkPair.0 } deinit { sendNext(deinitSignalProducerSinkPair.1, ()) } } 

y luego en mi model de vista

 public class DetailViewModel: BaseViewModel { let title: String let subtitle: String let author: String let createdAt: NSDate let timerCounter = MutableProperty<Int>(0) let inputText = MutableProperty<String>("") let reverseInputText = MutableProperty<String>("") var formattedCreatedAt: String { let formatter = NSDateFormatter() formatter.dateFormat = "dd/MM/yy" return formatter.stringFromDate(createdAt) } public requinetworking init(title: String, subtitle: String, author: String, createdAt: NSDate) { self.title = title self.subtitle = subtitle self.author = author self.createdAt = createdAt super.init() timerCounter <~ createTimerSignalProducer() reverseInputText <~ (inputText.producer |> map { String(reverse($0)) }) } // MARK - Private methods private func createTimerSignalProducer() -> SignalProducer<Int, NoError> { return NSNotificationCenter.defaultCenter().rac_notifications(name: "TimerNotification") |> map { $0.userInfo!["TimerCount"] as! Int } |> takeUntil(deinitSingalProducer) } }