2017-03-16 13 views
1

CocoaAsyncSocket 및 STOMP 프로토콜을 기반으로 간단한 메시지 앱을 만들고 있습니다.CocoaAsyncSocket을 사용하여 PublishSubject를 올바르게 사용합니다.

class StompStream: NSObject { 
//MARK: - Public 
    var inputFrame = PublishSubject<StompFrame>() 

//MARK: - Private 
    fileprivate var socket: GCDAsyncSocket! 
    ... 
    ... 
    fileprivate func parse(withData data: Data) { 
     let string = String(data: data, encoding: .utf8) 
     do { 
      let frame = try StompFrame(text: string) 
      self.inputFrame.on(.next(frame)) 
     } catch { 
      self.inputFrame.on(.error(error)) 
     } 
    } 
} 
//MARK: - GCDAsyncSocketDelegate methods 
extension StompStream: GCDAsyncSocketDelegate { 
    ... 
    ... 
    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) { 
     self.parse(withData: data) 
    } 
} 

그래서, inputFrame을 읽을 수있는 다른, 그냥 할 :

fileprivate func subscribeToEvents() { 
    self.stompStream.inputFrame 
     .observeOn(SerialDispatchQueueScheduler(queue: Queues().stompQueue, internalSerialQueueName: "stomp")) 
     .subscribe(onNext: { inputFrame in 
      //do some stuff 
     }).addDisposableTo(self.disposeBag) 
} 

I를 가입자가이 같은 들어오는 STOMP 프레임을 관찰 할 수 있도록 그래서, PublishSubject를 사용하는 주요 클래스를 생성 RxSwift에 매우 익숙하고을 사용하는 것이 더 낫습니다. 이벤트를 읽는 것이 좋지만 PublishSubject를 사용하면 다음과 같이 초기화 할 수 있습니다 : PublishSubject<StompFrame>()Observable<StompFrame> 어떻게해야하는지 이해할 수 없었습니다. 그런, 어떤을 창조하지 않고 func, wher e 나는 Observable.create { }을 반환 할 것이므로, 누군가가 이벤트를 받기를 원할 때마다 Observable<StompFrame>을 만들지 만, PublishSubject은 오직 하나뿐입니다. 나에게 코드가 무효 세계에 필수적에서 해소되어 있기 때문에이 수신 물건 :

답변

1

설명에 어떤 도움 덕분에, 여기가 의미가 후드 아래 PublishSubject를 사용 할 수 있습니다.

이 주제를 비공개로 설정하고 Observable 만 외부 사용자에게 노출시키는 것이 좋습니다.

class StompStream: NSObject { 
    var inputFrame: Observable<StompFrame> { 
     return inputFrameSubject.asObservable() 
    } 

    private let inputFrameSubject = PublishSubject<StompFrame>() 

    // ... 
} 

이 때 제목을 사용 여부에 대한 의심, 난 항상 this post를 참조하십시오. C# 용으로 작성되었지만,이 주제에 대한 훌륭한 참고서입니다.