2016-02-25 16 views
5

ReactiveCocoa'nın (kavramsal olarak) tüm temel bileşenlerini anladığım gibi, tüm parçaları birbirine nasıl bağlayacağınızı anlayarak biraz kafa karıştırıcı oluyor.Neden SignalProducer bir Sinyal vermiyor?

Örneğin, Sinyal hakkında okuduktan sonra, ben tam sadece şöyle kullanırsınız bir Sinyali döndü bir start() yöntemini olması SignalProducer beklenen:

mySignalProducer.start().observe(myObserver) 

Bunun yerine, bir geçmek zorunda baştan içine gözlemci() ve SignalProducer aramalar() sizin için dikkat edin:

mySignalProducer.start(myObserver) 

Bu gözlemlemek varyasyonları tüm() olmak zorunda çünkü SignalProducer arayüzü (daha fazla anlamak için) çok daha büyük olduğu anlamına gelir başlangıçta() (örneğin startNext(), vb.) çoğaltılır.

Burada iki olasılık vardır düşünüyorum:

  1. neden (başlangıç ​​teknik nedenleri vardır) sadece onun arayüzünün
  2. ait sakat beklentilerine yol açan kavramsal SignalProducer yanlış bir Sinyali
  3. döndüremez

1 durumunda, bunun tam olarak anlamadığım bellek yönetimi ve tek kullanımlık şeyler ile ilgili bir şey olduğunu tahmin ediyorum.

2 durumdan endişe duyuyorum. Dahili olarak, SignalProducer benim anlayış temelde, bir Fabrikası'nın kavramına eşleştirilir örneğin Sanırım bir Sinyali döndüren bir start() bulmuyorum şaşırdım neden olduğu .:

mySignalFactory.createSignal().observe(myObserver) 

.

Eğer topluluk burada bir miktar ışık tutabilirse çok minnettar olurum.

Teşekkürler!

cevap

5

Sanırım ana sebep, üreticinin başladığında bazı olayların hemen gönderilebileceğidir. Örneğin

, başlangıç ​​serisi arayüzü gibi ve başlangıç ​​zaman doğrudan bir sinyal almak için istemiyorsanız:

extension SignalProducer { 
    func getSignalFromStart() -> Signal<Value, Error> { 
     var signal: Signal<Value, Error>! 
     startWithSignal{ innerSignal, _ in 
      signal = innerSignal 
     } 
     return signal 
    } 
} 

Sonra bazı olayları kaçırabilirsiniz. Bunu deneyin:

// When property.producer starts, it will send its current value immediately 
let property = MutableProperty(1) 

property.producer.getSignalFromStart().observeValues { value in 
    print("getSignalFromStart \(value)") // maybe not what you want, only gets 2 
} 

property.producer.startWithValues { value in 
    print("normal start \(value)") // this normally gets 1 and 2 
} 

property.value = 2 
İlgili konular