2015-08-20 6 views
0

Я хочу получить что-то вроде этого: У меня есть запрос, который производит наблюдаемый, а также у меня есть кеш памяти, который может быть объектом поведения. В моем коде я хочу объединить эти два наблюдаемых таким образом, что если у субъекта есть некоторые данные, я хочу их взять и не начинать запрос наблюдаемым. Может ли что-то подобное быть достигнуто?RxJava merge Наблюдаемые данные, но результат только с первых

На данный момент я делаю что-то вроде этого:

val resp = run { run(Task.GetMessages()) } 

return InboxModel(news = Observable.merge(IoImplementation.cachedUserMessages(), resp).distinctUntilChanged()) 

, но я не думаю, что это хорошо

+0

Будет ли ваш кеш и реальные наблюдаемые данные испускать только одно значение? – Aaron

+0

ну на первом запуске я получаю данные из задачи, а затем храню их в кеше памяти, но я хочу, чтобы данные были испусканы только из кеша, когда пользователь поворачивает экран и не запускает запрос. Я должен был упомянуть, что я нахожусь на android. –

ответ

0

Это звучит, как вы хотите, чтобы попытаться найти работу в кэше наблюдаемую и только если он пуст, попробуйте сделать настоящую работу. Оператор observable.switchIfEmpty(Observable) должен делать то, что вам нужно. Если ваш наблюдаемый кеш пуст, он будет подписаться на реальную работу, наблюдаемую.

public void handleRequests(Observable<Request> requests) { 
    requests.flatMap(Request r -> { 
      String key = r.getSomeCacheKey(); 
      return getFromCache(key) 
       .switchIfEmpty(doRealWork(r) 
        .doOnNext(saveToCache(key)) 
       ); 
     }) 
     .subscribe((String response) -> System.out::println); 
} 

// hashmap based cache may not be what you want but i'm 
// including it for completeness of example 
Map<String, Observable<String>> cache = //... 

Observable<String> getFromCache(String key) { 
    return cache.get(key); 
} 

Action1<String> saveToCache(String key) { 
    return (String response) -> cache.put(key, response); 
} 

Observable<String> doRealWork(Request someRequest) { 
    // imagine real work here 
    return Observable.just("some response"); 
} 
+0

спасибо, дайте эту попытку, будет держать вас в курсе :) –

+0

ну, похоже, решает мою проблему, но мне нужно как-то переосмыслить мою работу по вызову netwrok. Большое спасибо :) отметит это –

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