Я пытаюсь добавить библиотеку RX Android pack в предыдущем проекте MVC, в котором я пытаюсь обработать значения из ответов API на контроллер Activity, передавая некоторый контроллер, который будет выполнять над ним некоторые дополнительные операции.
Возможны следующие варианты: значение может быть пустым / необязательным / нулевым с помощью API, в этом случае контроллер попытается получить значение из кэш-памяти, которая также может находиться в том же состоянии, и, наконец, передатьэто к контроллеру, где, в зависимости от значения, он будет выполнять какую-то инициирующую операцию или пытаться выполнить другой вызов API с тем же механизмом, проверить этот ответ и затем выбрать способ инициации действия.
Пример кода (подписи неверны)
В API:
Maybe<User> getUser(){
//...
}
В контроллере:
Single<User> getUser(){
return API.getUser().switchIfEmpty(() -> Cache.getUser());
}
В действии:
Disposable d = getUser().subscribe(user -> { if(user != null) init(user); else checkGuest(); } );
//...
void checkGuest(){
Disposable d = getGuest().subscribe(guest -> { init(guest) } );
}
Все это было бы невероятно круто и гладко, за исключением рассмотрения, RX Java не может обрабатывать нулевые значения .Мы можем сказать, что, начиная с Java 8, где пытаются перебрать нулевые значения в пользу необязательных значений ( действительно?!?!? ), поэтому шаблон Empty / Maybe будет уместен.
Итак, давайте попробуем это ...
В API:
Maybe<User> getUser(){
//...
}
В контроллере:
Single<User> getUser(){
return API.getUser().switchIfEmpty(() -> Cache.getUser()).switchIfEmpty(() -> ???);
}
В активности:
Disposable d = getUser().subscribe(user -> { if(user != ???) init(user); else checkGuest(); } );
//...
void checkGuest(){
Disposable d = getGuest().subscribe(guest -> { init(guest) } );
}
Я хочу сказать, что я ненавижу и вообще не могу принять, чтобы изменить мои модели , чтобы добавить вид дополнительного атрибута, который бы обозначал экземпляр как экземпляр Rx nulled, также потому, что это абсолютное нарушение целостности, как и в любом другом методе, было бы обязательным проверять этот атрибут с помощью looooot шаблонной таблицы.
Решения:
1 Я пытаюсь справиться с этимпросто используя условную проверку одиночного и пользовательского исключения в ошибке подписки, чтобы решить, куда перейти к следующему методу в распространении цепочки, смешивая функциональное и реактивное программирование.
2 Я должен был бы изменитьмои модели, и использоватьRX Обнуляет экземпляры вместо наших любимых нулевых значений, но, конечно, также потому, что я использую Realm, и я даже не могу использовать полиморфизм, а также он нарушает целостность, как было сказано ранее.
3 В идеале я хотел бы сохранить шаблон цепочки и, используя Maybe, иметь возможность выполнить путь цепочки, если предыдущее значение пустое, или другой путь цепочки, если значение не задано.
Я был бы рад, если бы кто-то захотел опередить вариант 3, который заставил бы меня сказать «ВАУ» в первый раз, когда я увидел пример ReactiveX.