2015-12-31 8 views
6

HTTPServiceObservable<NSData>を返します。私の目標は、そのサービスを別のサービス(便宜的にそのデータを変換するServiceA)に組み立てることです。 ServiceAのRxSwift 2.0.0-rc.0にObservable.createを使用すると、それはまっすぐなものです。私の質問は、HTTPServiceのサブスクリプションから返された使い捨て品を適切に処理する方法です。観察可能な範囲内でディスポーザブルを処分する適切な方法

私が何もしなければ、コンパイル時にresult of call is unusedhttp://git.io/rxs.udという警告が表示されます。私は何もしない場合、それはおそらく大丈夫だことを読んでから理解:(下記xsはケースXSでlet xs: Observable<E> ....

が完了またはエラーメッセージを表示して予測可能な方法で終了され、処理していないサブスクリプションの使い捨ては、すべてのリソースをリークされませんが、それはそうここ

。なぜなら要素の計算が予測可能な瞬間に終了し、そのようにまだ好ましい方法です私は現在、それに対処しています、と私は適切か、私が持っている場合は、これをやっている場合も、どこ、私は疑問に思ってどのようです何かを誤解した。

public struct ServiceA{ 

    public static func changes() -> Observable<ChangeSet>{ 
     return Observable.create{ observable in 

      // return's Observable<NSData> 
      let request = HTTPService.get("https://httpbin.org/get") 

      let disposable = request.subscribe(
       onNext: { data in 
        // Do more work to transform this data 
        // into something meaningful for the application. 
        // For example purposes just use an empty object 
        observable.onNext(ChangeSet()) 
        observable.onCompleted() 
       }, 

       onError:{ error in 
        observable.onError(error) 
       }) 

      // Is this the right way to deal with the 
      // disposable from the subscription in this situation? 
      return AnonymousDisposable{ 
       disposable.dispose() 
      } 
     } 
    } 
} 

答えて

2

documentation

を言うように関数は、計算や無料のリソースをキャンセルするために使用することができ、サブスクリプション使い捨てを返しますサブスクライブします。
これらの流暢な通話を終了する好ましい方法は、 .addDisposableTo(disposeBag)を使用するか、それと同等の方法で行います。 disposeBagの割り当てが解除されると、サブスクリプションは自動的に廃棄されます 。

実際にあなたの例では、ルールの面で正常に見えるが、それはかなり悪いロース;)(あなたはこのdisposableを返す場合にも、それは、大丈夫でしょう):

public static func changes() -> Observable<ChangeSet>{ 
     return Observable.create{ observable in 

      // return's Observable<NSData> 
      let request = HTTPService.get("https://httpbin.org/get") 

      return request.subscribe(
       onNext: { data in 
        // Do more work to transform this data 
        // into something meaningful for the application. 
        // For example purposes just use an empty object 
        observable.onNext(ChangeSet()) 
        observable.onCompleted() 
       }, 

       onError:{ error in 
        observable.onError(error) 
        }) 
} 

しかし、もしあなたと返すObserveble私はなぜ、あなたはmap演算子を使用しないでくださいか?あなたは完全に再上でスポットされている

public static func changes() -> Observable<ChangeSet> { 
    return HTTPService.get("https://httpbin.org/get") 
         .map(ChangeSet.init) 
} 
+0

:: 'map'を

あなたの例では、このようなものになるだろう。私はそれについて完全に忘れました、ありがとう! 'disposeBag'については、静的な関数なので、' disposeBag'がそのスコープ内で正しいことは分かりませんが、間違いなくマップは素晴らしい提案です、もう一度ありがとうございます。 –

+0

あなたは歓迎です:) RxSwiftを楽しんでください –