2016-03-16 29 views
8

Tôi là người mới trong RxSwift và cần trợ giúp rất cơ bản.
Giả sử rằng tôi có một Đài quan sát và đăng ký nó như thế này.Phát hiện sự kiện theo cách thủ công trong RxSwift

let source: Observable<Void> = Observable.create { [weak self] observer in 

     guard let _ = self else { 
      observer.on(.Completed) 
      return NopDisposable.instance 
     } 

     observer.on(.Next()) 

     return AnonymousDisposable { 

     } 
    } 

Và đăng ký như thế này:

source.subscribeNext {() -> Void in 

    } 

Câu hỏi đặt ra là: làm thế nào tôi có thể phát ra sự kiện để subscribeNext bằng tay mỗi khi tôi cần. Điều này giống như hành vi rx_tap trên UIButton.
Tôi thấy trong mã ví dụ có một cái gì đó như thế này source = button.rx_tap.asObservale(). Sau đó, mỗi lần người dùng chạm vào nút, sẽ phát ra một sự kiện và kích hoạt trên subscribeNext(). Tôi cũng muốn có hành vi đó nhưng theo lập trình, không phải từ sự kiện giao diện người dùng.

Trả lời

11

Hầu hết thời gian, bạn có thể soạn quan sát và giải pháp mà tôi sắp đưa ra không phải là cách được khuyến nghị để làm mã Rx.

Bạn có thể xem Subject để triển khai hành vi bạn yêu cầu. Có nhiều biến thể về chủ đề, tài liệu giải thích rõ ràng.

Một ví dụ sử dụng, lấy cảm hứng từ RxSwift của playground:

let subject = PublishSubject<String>() 

_ = subject.subscribeNext { content in 
    print(content) 
} 
subject.on(.Next("a")) 
subject.on(.Next("b")) 

này sẽ in "a" sau đó "b".

Để biết thêm chi tiết về thời điểm sử dụng chủ đề hay không, tôi khuyên bạn nên đọc this article.

+0

Hi @tomahh, giải pháp của bạn. Tuy nhiên, lý do gì bạn đề cập đến nó là 'không phải là cách được đề nghị'? Và cách so sánh nó với '' 'AnyObserver ' ''.
Với '' 'AnyObserver <>' '', chúng ta có thể sử dụng nó như:
'var beginLoad: AnyObserver ' 'beginLoad = AnyObserver (eventHandler: {(sự kiện) -> Void trong print (" 1234543 ") })' 'beginLoad.on (.Next())' – user1066518

+0

Ngoài ra '' 'PublishSubject ()' '' không phải là '' 'Quan sát''', vì vậy chúng ta không thể sử dụng toán tử trên đó (san phẳng, concat ....). – user1066518

+1

Bạn có thể gọi 'asObservable() 'trên đối tượng để lấy nó như là một' Observable'. – tomahh

0

Đối với một điều khiển, bạn có thể làm việc

var isSearching: Driver<Bool> 

isSearching = Driver.just(true) 
Các vấn đề liên quan