2015-12-18 10 views
6

के साथ वापसी एक नया नमूदार मैं एक समारोह है कि एक बूल नमूदार निर्भर करता है अगर यह ठीक था या नहीं लौटने की है।RxSwift: एक त्रुटि

func test() -> Observable<Bool> { 
    if everythingIsOk { 
     return just(true) 
    } 
    return just(false) <- how can i here return a custom error to retrieve what failed? 
} 
+0

'लौट failWith (MyError())' –

उत्तर

8
just<E>(element: E) -> Observable<E> 

एक नमूदार अनुक्रम है कि एक ही तत्व शामिल देता है। इसके बजाय, आप ऐसा ही कुछ का उपयोग करना चाहिए:

create<E>(subscribe: (AnyObserver<E>) -> Disposable) -> Observable<E> 

विधि एक निर्दिष्ट सदस्यता के विधि कार्यान्वयन से एक नमूदार अनुक्रम बनाता है बनाएँ।

आपके मामले में:

private let realm = try! Realm() 

func save(customObject: CustomObject) -> Observable<Bool> { 
    return create({ observer -> Disposable in 
     do { 
      try self.realm.write { 
       self.realm.add(customObject, update: true) 
       observer.onNext(true) 
       observer.onCompleted() 
      } 
     } catch { 
      // .Error sequence will be automatically completed 
      observer.onError(NSError(domai...) 
     } 

     // if realm.write is sync task(by default it is, as I know) you can actually return NopDisposable 
     return NopDisposable.instance 
     // otherwise you should cancel write transaction in AnonymousDisposable 
    }) 
} 

AnonymousDisposable कार्रवाई उस मामले में कहा जाता है आप बाधित प्राप्त करना चाहते है। मान लें कि आप अपना व्यू कंट्रोलर छोड़ दें या ऐप को सेवा के साथ किया जाना चाहिए और आपको अब इस अनुरोध को कॉल करने की आवश्यकता नहीं है। वीडियो अपलोड या कुछ बड़ा होने के लिए यह बहुत अच्छा है। आप request.cancel() कर सकते हैं जो आपके द्वारा किए जाने पर सभी संसाधनों को साफ़ करता है। इसे या तो पूर्णता या त्रुटि पर बुलाया जाता है।

+0

पर 'डिस्प्ले' कॉल करें बस इसे अपने अनुभव में जोड़ना चाहते हैं, इसे ऑननेक्स्ट() इत्यादि रखना सर्वोत्तम है। कोशिश ब्लॉक के बाहर। दायरे का लेखन वास्तव में तब तक जारी नहीं रहता जब तक कि यह बंद न हो। – Morgz

2

अवलोकन बनाने के लिए create फ़ंक्शन है। आप इसे इस तरह का उपयोग कर सकते हैं:

func test() -> Observable<Bool> { 
    return create({ (observer) -> Disposable in 
//  Some condition 
     observer.onNext(true) 
//  Some other condition 
     observer.onNext(false) 
//  Some other condition 
     observer.onError(NSError(domain: "My domain", code: -1, userInfo: nil)) 
//  Some other condition 
     observer.onCompleted() 

     return AnonymousDisposable { 
//   Dispose resources here 
     } 
//  If u have nothing to dipose use NopDisposable.instance 


    }) 
} 
+0

क्या अपने सरल उदाहरण में observer.onNext (सही) और बस (सही) – Godfather

+1

के बीच का अंतर वहाँ कोई अंतर नहीं है, लेकिन और अधिक जटिल में, उदाहरण के लिए यदि आप नेटवर्क अनुरोध जैसे कुछ एसिंक्रोनस काम करने या डेटा बेस से कुछ डेटा लाने की आवश्यकता है, आप इसे करने में सक्षम नहीं होंगे। और बस ऑपरेटर कभी असफल नहीं होता यह "बस" मूल्य है, जो आप –

+0

अगर ठीक क्या पोस्ट करने के लिए इस कोड को पोस्ट? https://gist.github.com/anonymous/4619dbfc30c346a63c05 – Godfather

0

अपने नमूदार मूल्य के रूप में एक परिणाम enum का प्रयोग करें।

public enum Result<Value> { 
    case success(Value) 
    case failure(Error) 
} 

func test() -> Observable<Result<Bool>> { 
    if everythingIsOk { 
     return just(.success(true)) 
    } 

    let error = ... 
    return just(.failure(error)) 
} 
+0

अवलोकनों को निर्दिष्ट प्रकार के मान भेजना चाहिए, या असफल होना चाहिए। 2 मिश्रण करना अवलोकन अवधारणाओं के लिए एक नकारात्मक पैटर्न है क्योंकि आप एक त्रुटि प्राप्त कर सकते हैं या तो 'ऑनक्स्ट' ब्लॉक और 'ऑनरर' ब्लॉक में। – Ariel

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