2016-02-25 16 views
5

Tôi cảm thấy như tôi hiểu tất cả các thành phần cơ bản của ReactiveCocoa (khái niệm), bằng cách hiểu làm thế nào để kết nối tất cả các mảnh với nhau vẫn còn một chút khó hiểu.Tại sao SignalProducer không trả lại tín hiệu?

Ví dụ, sau khi đọc về tín hiệu, tôi hoàn toàn mong đợi SignalProducer chỉ có một phương pháp start() mà trở lại một tín hiệu, mà bạn sẽ sử dụng như sau:

mySignalProducer.start().observe(myObserver) 

Thay vào đó, bạn phải vượt qua một quan sát viên vào start(), và SignalProducer cuộc gọi quan sát() cho bạn:

mySignalProducer.start(myObserver) 

Điều này có nghĩa rằng giao diện của SignalProducer là lớn hơn nhiều (hơn để hiểu), vì tất cả các biến thể trên quan sát() phải trùng lặp khi bắt đầu() (ví dụ startNext(), v.v.).

Tôi nghĩ có hai khả năng ở đây:

  1. Có nhiều lý do tại sao kỹ thuật bắt đầu() có thể không chỉ đơn giản là trả lại một tín hiệu
  2. tôi hiểu sai SignalProducer khái niệm, dẫn đến sự mong đợi rung rinh của giao diện của nó

Nếu 1 là trường hợp, tôi đoán rằng có điều gì đó liên quan đến quản lý bộ nhớ và các lần gỡ bỏ mà tôi chưa hiểu đầy đủ.

Tôi lo lắng hơn là 2 trường hợp. Bên trong, sự hiểu biết của tôi về SignalProducer về cơ bản là ánh xạ tới các khái niệm về một nhà máy, ví dụ .:

mySignalFactory.createSignal().observe(myObserver) 

đó là lý do tôi ngạc nhiên, chúng tôi không tìm thấy một start() trả về một tín hiệu.

Tôi sẽ cực kỳ đánh giá cao nếu cộng đồng có thể làm sáng tỏ ở đây.

Cảm ơn!

Trả lời

5

Tôi nghĩ lý do chính là một số sự kiện có thể được gửi ngay lập tức khi nhà sản xuất bắt đầu.

Ví dụ, nếu bạn không thích giao diện hàng loạt bắt đầu, và muốn nhận được một tín hiệu trực tiếp khi bắt đầu:

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

Sau đó, bạn có thể bỏ lỡ một số sự kiện. Hãy thử điều này:

// 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 
Các vấn đề liên quan