2015-12-31 31 views
6

के भीतर एक डिस्पोजेबल का निपटान करने का सही तरीका मेरे पास HTTPService है जो Observable<NSData> देता है। मेरा लक्ष्य उस सेवा को किसी अन्य सेवा, ServiceA में लिखना है जो मेरे उपयोग के मामले के लिए उस डेटा को बदलता है। Observable.create का उपयोग 0xमें RxSwift 2.0.0-rc.0 में यह सीधे आगे पर्याप्त है। मेरा सवाल यह है कि HTTPService की सदस्यता से लौटे डिस्पोजेबल को सही तरीके से कैसे संभालना है।एक अवलोकन योग्य

यदि मैं कुछ नहीं करता तो मुझे संकलन समय चेतावनी मिलती है कि result of call is unused: http://git.io/rxs.ud। मैं पढ़ रहा है कि यह संभावना है ठीक है अगर मैं कुछ नहीं कर से समझते हैं: (जहां xs नीचे उल्लेख let xs: Observable<E> ....

मामले XS में पूरे या त्रुटि संदेश के साथ एक उम्मीद के मुताबिक रास्ते में समाप्त हो जाता है है, हैंडलिंग नहीं सदस्यता डिस्पोजेबल किसी भी संसाधन लीक नहीं होगा , लेकिन यह अभी भी जिस तरह से पसंद किया जाता है क्योंकि इस तरह तत्व में गणना उम्मीद के मुताबिक इस समय समाप्त हो जाता है।

तो यहाँ कैसे मैं वर्तमान में यह संबोधित कर रहा हूँ, और भी है जहाँ मैं या अगर मैं इस ठीक से कर रहा हूँ सोच रहा हूँ कि मेरे पास है कुछ गलत समझा।

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'

अपने उदाहरण में यह कुछ इस तरह होगा। मैं पूरी तरह से भूल गया, धन्यवाद! 'डिस्प्लेबैग' के लिए, क्योंकि यह एक स्थिर func है, मुझे नहीं पता कि एक 'निपटान बाग' उस दायरे में सही बात होगी, लेकिन निश्चित रूप से नक्शा एक अच्छा सुझाव है, धन्यवाद। –

+0

आपका स्वागत है :) RxSwift के साथ मजा करो –

संबंधित मुद्दे