2015-12-31 3 views
6

У меня есть HTTPService, который возвращает Observable<NSData>. Моя цель состоит в том, чтобы составить эту услугу в другую службу, ServiceA, которая преобразует эти данные в мой прецедент. Используя Observable.create в RxSwift 2.0.0-rc.0 в ServiceA, он достаточно прямолинейный. Мой вопрос заключается в том, как правильно обрабатывать одноразовое устройство, возвращаемое из подписки HTTPService.Правильный способ утилизации одноразового в пределах наблюдаемого

Если я ничего не предпринимаю, я получаю предупреждение о времени компиляции, которое result of call is unused: http://git.io/rxs.ud. Я понимаю, от чтения, что, если я ничего не делаю это, вероятно, хорошо: (где 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) 
        }) 
} 

Но, как вы вы return Observeble Интересно, почему вы просто не используете map оператора?

В вашем примере это будет что-то вроде этого:

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

вы полностью пятно на ре: 'map'. Я совсем забыл об этом, спасибо! Что касается 'disposeBag', поскольку это статическая функция, я не знаю, что' disposeBag' будет правильным в этой области, но определенно карта - отличное предложение, спасибо вам снова. –

+0

Добро пожаловать :) Удачи с RxSwift –

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