2013-08-12 14 views
19

Bir bildirim adından nasıl bir sinyal çıkarabilirim? Mesela ben gitmek istiyorum:Bildirimlerle Reaktif Kakaolu nasıl kullanılır?

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(userDidChange:) 
              name:kTTCurrentUserLoggedOffNotification 
              object:nil]; 

gibi bir şey: In

[signalForName(kTTCurrentUserLoggedOffNotification) subscribeNext:^(id x){ 
... 
}]; 

cevap

45

-[NSNotificationCenter rac_addObserverForName:object:] sonsuz bir sinyal verir: bu, bu amaç için bir yöntem vardır. Sen

NSNotificationCenter.defaultCenter() 
    .rac_addObserverForName(UIKeyboardWillShowNotification, object: nil) 
    .takeUntil(self.rac_willDeallocSignal()) 
    .subscribeNext { (_) in 
    print("Notification received") 
    } 

Bu sinyal sonsuz belirtildiği gibi

[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] 
    takeUntil:[self rac_willDeallocSignal]] 
    subscribeNext:^(id x) { 
    NSLog(@"Notification received"); 
}]; 

Swift bu

Amaç-c gibi ona abone olabilirler. Eğer self ömrü için bağlayıcı olduğunu bu sinyal/abonelik gerekiyorsa böyle rac_willDeallocSignal ile takeUntil: ekleyebilirsiniz:

Amaç-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") 
    } 
+0

Bu kesinlikle işe yarıyor gibi görünüyor. Fakat eğer böyle yapılması gerekiyorsa, bu yöntem temelde kusurludur. Sinyaller, onlara referans olana kadar yaşar. Sinyal serbest bırakılırsa, o zaman gözetleyiciyi kaldırır. Kodunuzda etrafınıza bakabilir, sinyali serbest bırakılmasını engelleyen sinyalin güçlü bir referansı olabilir. Ya da durum böyle değilse, lütfen benim düşüncemde beklenen davranış olmadığı için projeye bir sorun bildirin. – allprog

+4

@allprog [Aboneler sinyallerini korur] (https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/MemoryManagement.md) tamamlanma, hata veya bertaraf edilene kadar. Bu yüzden sonsuz sinyaller oldukça gnarly olabilir. '-takeUntil:' belirli bir noktada sinyali deterministik olarak sonlandıran iyi bir çözüm veya benzer bir şeydir. –

+2

@ JustinSpahr-Summers Açıklama için teşekkürler. Kurt atmak için çok hevesli olduğumu biliyordum! Ama beni düzeltmek için oradasın. :) Belgeler bu incelikleri içerebiliyor mu? Örneğin. "bu sonsuz bir sinyaldir" ve birisinin dikkate alması gerekenleri gösteren bir açıklamaya işaret eder. Dürüst olacağım, çerçeve bu "bubi tuzaklarından" birine sahip gibi görünüyor ve bu durumlarda iade edilen sinyalin özellikleri vurgulandığında daha iyi olurdu. – allprog

10

RACExtensions sen NSNotificationCenter (RACSupport) kategoriyi bulabilirsiniz.

- (RACSignal *)rac_addObserverForName:(NSString *)notificationName 
           object:(id)object; 
+1

Bu durumun asla çıkarılmadığını görüyorum .. Bu sinyali kendimiz mi atmamız gerekiyor? – hfossli

+0

Gözlem, sinyale bağlı. Bu bertaraf edilirse, gözlemci kaldırılır. Bir yere sinyale güçlü bir referans tutuyor olabilir misiniz? (Bu, ObjC'nin zor kısmı :)) – allprog

+2

Yeni çıkan yanıtı gör – hfossli

-1

ReactiveCocoa 4.1 kullanarak Swift sürümü:

NSNotificationCenter.defaultCenter() 
     .rac_addObserverForName(UIKeyboardWillShowNotification, object: nil) 
     .takeUntil(self.rac_willDeallocSignal()) 
     .subscribeNext { (_) in 
      print("UIKeyboardWillShowNotification") 
     }