2013-08-12 6 views

答えて

45

-[NSNotificationCenter rac_addObserverForName:object:]は無限の信号を返します。あなたは無限に述べたように、この信号がある

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

スウィフトこの

Objective-Cのようにそれに

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

を購読することができます。あなたがselfの寿命に拘束されることに、この信号/サブスクリプションが必要な場合は、次のようにrac_willDeallocSignaltakeUntil:を追加することができます。

Objective-Cの

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

スウィフト

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

これは確かにうまくいくようです。しかし、このようにしなければならない場合、その方法は根本的に欠陥があります。信号はそれらへの参照があるまで生きています。信号が解放された場合は、それを廃棄してオブザーバを取り除く必要があります。あなたのコードを見回すかもしれません、それが割り当て解除されないようにする信号への強い参照があるかもしれません。そうでない場合は、私の意見では期待された動作ではないため、問題をプロジェクトに報告してください。 – allprog

+4

@allprog [購読者は、完了、エラー、または廃棄までシグナルを保持します(https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/MemoryManagement.md)。だからこそ、無限の信号がかなり耳障りになることがあります。 '-takeUntil:'はよい解決策です。ある点で確定的に信号を終了させるようなものです。 –

+2

@ JustinSpahr-Summers清算をありがとう。私はあまりにも狼を叫ぶのに熱望していたことを知っていた!しかし、あなたは私を修正するためにそこにいます。 :)ドキュメントにはこれらの複雑さが含まれていますか?例えば。 「これは無限の信号です」と、何が考慮に入れる必要があるかを示す何らかの記述へのポインタを与える。私は正直言ってフレームワークはこれらの "ブービートラップ"のいくつかを持っているようで、これらのケースで返される信号の詳細が強調されればよいでしょう。 – allprog

10

あなたがNSNotificationCenter (RACSupport)カテゴリを見つけることができますのようなものに

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

:たとえば、私はから行きたいです。これには、この目的のためのメソッドがあります。

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

これは決して削除されません。このシグナルは自分で処理する必要がありますか? – hfossli

+0

観測は信号に結びついています。それが配置されている場合、オブザーバは削除されます。どこかの信号を強く参照していることができますか? (これはObjCの難しい部分です:)) – allprog

+2

見つけました:)新しい回答が表示されます – hfossli

-1

Swiftバージョン使用ReactiveCocoa 4.1

関連する問題