2014-03-04 32 views
5

ReactiveCocoa可以通過調用-subscribeCompleted:將信號轉換爲「熱」信號。但是,如果您不關心結果(即沒有訂戶),我認爲這種方法非常冗長。如何使RACSignal變熱?

RACDisposable *animationDisposable = [[self play:animation] subscribeCompleted:^{ 
    // just to make the animation play 
}]; 

而這3行不足以表達我的意圖。

有沒有類似的用途?謝謝!

+0

這真的取決於你最終如何使用它。你關心結果嗎? – joshaber

+0

我只想讓它變熱(=讓它運行一次)。我想要更有表現力的東西。上面的實現是模糊的。新的程序員可能會認爲它被錯誤地調用並刪除它。 – HKTonyLee

回答

5

我只想讓它變熱(=讓它運行一次)。

"You keep using that word. I do not think it means what you think it means."

「熱信號」是不管發送值(可能不工作)的是否有任何訂戶的信號。 A 「冷信號」是一種信號,它推遲其工作併發送任何值直到它有用戶。並且冷信號將執行其工作並且發送每個訂戶的值。

如果您想讓冷信號只運行一次但擁有多個用戶,您需要多播的信號。多播是一個非常簡單的概念,其工作原理如下:

  1. 創建一個RACSubject來代理您希望執行一次的信號發送的值。
  2. 根據需要多次訂閱主題。
  3. 爲您只想執行一次的信號創建一個訂閱,對於信號發送的每個值,將其發送到[subject sendNext:value]的主題。

但是,你可以和應該使用RACMulticastConnection做上述所有的用更少的代碼:

RACMulticastConnection *connection = [signal publish]; 
[connection.signal subscribe:subscriberA]; 
[connection.signal subscribe:subscriberB]; 
[connection.signal subscribe:subscriberC]; 
[connection connect]; // This will cause the original signal to execute once. 
         // But each of subscriberA, subscriberB, and subscriberC 
         // will be sent the values from `signal`. 
+0

非常感謝。但這不是我想要的。我想發出一個我不關心結果的信號(即沒有用戶)。在純粹的功能環境中很難做到,但它發生在有狀態的環境中。這與「無」代表類似。如果我不需要回調,我可以放心地忽略委託屬性,而不是通過執行大量空函數來符合整個委託。它不那麼富有表現力。 – HKTonyLee

+0

我不知道我的問題是否有用: - /我認爲一些新手(包括我,大聲笑)也會問類似的問題。 – HKTonyLee

+0

ReactiveCocoa的要點是讓你優雅地處理*結果*的工作。如果所有你想要的工作都是作爲副作用發生的,而你並不在乎處理結果,那麼ReactiveCocoa並沒有真正爲你做太多工作。 – erikprice

4

如果你不關心信號的輸出(出於某種原因,你真的想發揮成爲一個信號),你可能想要做出一個命令。命令會通過某種事件(例如按下按鈕或其他事件)執行信號。只需創建Signal,將其添加到命令中,然後在需要運行它時執行它。

@weakify(self); 
RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^(id input) { 
    @strongify(self); 
    return [self play:animation]; 
}]; 

//This causes the signal to be ran 
[command execute:nil]; 

//Or you could assign the command to a button so it is executed 
// when the button is pressed 
playButton.rac_command = command; 
+0

謝謝!我認爲我對反應式編程有一些錯誤的概念。我還是想出來;-) – HKTonyLee

+0

!!!!這個線程已經解釋了RACCommand實質上比任何ReactiveCocoa文檔都要好。謝謝! – fatuhoku