2015-12-18 2 views
6

У меня есть функция, которая возвращает Bool Observable в зависимости от того, было ли это нормально или нет.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

Просто хочу добавить, что по моему опыту лучше всего поставить onNext() и т. Д. за пределами блока try. Запись Realm на самом деле не сохраняется до тех пор, пока она не будет закрыта. – 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

Используйте результирующий результат в качестве наблюдаемого значения.

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 является отрицательным шаблоном для концепции Obsables, потому что вы можете получить ошибку либо в блоке 'onNext', и в блоке' onError'. – Ariel

Смежные вопросы