По RxSwift4, Variable
перемещается в Deprecated.swift
маркировки возможного Deprecation из Variable
в будущем. Альтернативой, предлагаемой Variable
является BehaviorRelay
. Во время публикации этого вопроса, поскольку я не мог найти большую часть учебника по сети, используя BehaviorRelay
я размещаю такой фундаментальный вопрос здесь, в SO.
Предположим, что у меня есть вызов webService, и я получаю кусок данных, который является JSONArray, при разборе JSON-объекта один за другим. Я обновляю свойство Variable value
Вот мое объявление переменной
var myFilter = Variable<[MyFilterModel]>([MyFilterModel(data: "{:}")])
при получении нового элемента каждый раз, когда я обновляю переменную как
myFilter.value.append(newModel)
Поскольку переменная была привязана к CollectionView, collectionVie немедленно обновлял свой интерфейс с недавно добавленным объектом.
Проблема с BehaviorRelay
Теперь моя декларация выглядит
var myFilter = BehaviorRelay<[MyFilterModel]>(value: [MyFilterModel(data: "{:}")])
Но самая большая проблема заключается в том, что myFilter.value
является readOnly. Так очевидно
myFilter.value.append(newModel)
не является решением. Я понял, что могу использовать скорее accept
.
Но теперь, когда я пытаюсь проанализировать каждый элемент в ответ и обновить значение myFilter
self?.expertsFilter.accept(newModel)
Вышеприведенный оператор дает котировку ошибок
Невозможно преобразовать значение NewModel в ожидаемый тип аргумента [NewModel]
Очевидно, что он ожидает массив, а не отдельный элемент.
Временное решение:
Решение 1:
Таким образом, одно решение накапливает весь ответ во временном массиве и однажды запускает self?.expertsFilter.accept(temporary_array)
Решение 2:
Если мне нужно отправить событие onNext
подписчику на разбор каждого элемента, мне нужно скопировать значение self?.ExpertsFilter в новый массив, добавить к нему вновь обработанный элемент и вернуть новый массив.
Решение 3:
Избавьтесь от BehaviorRelay
и используйте BehaviorSubject
/PublishSubject
Первые два звучат угнетающе, потому что может возникнуть необходимость запуска пользовательского интерфейса при разборе каждого элемента, который я не могу подождать, пока не будет проанализирован весь ответ. Поэтому очевидно, что решение1 не очень полезно.
Второе решение гораздо более ужасно, потому что он создает новый массив (я знаю его временный и будет выпущен) каждый раз, чтобы отправить событие onNext.
Вопрос:
Поскольку BehaviorRelay
предлагается в качестве альтернативы Variable
am в дилемме, я использую accept
правильно?? Есть ли лучший способ решить эту проблему?
Пожалуйста помоги