Уведомление ViewController из модели (networkClient) в swift - PullRequest
0 голосов
/ 03 ноября 2018

У меня в приложении сложная сеть (я не использую сторонние зависимости из-за требований проекта). Например, я отправляю три сетевых запроса параллельно после того, как первые два запроса дают результаты. Вся моя работа в сети осуществляется в отдельных моделях, известных как networkClients (следуя шаблону MVC-S), и вызывается непосредственно из репозитория , а не из ViewControllers. Однако мне нужен последний запрос, чтобы уведомить мой viewController после получения ответа от сети. Как мне это сделать? Я не думаю, что центр уведомлений будет правильным решением, потому что он может вызвать утечки памяти, и я не нашел правильного подхода к такой сложной проблеме, как эта. Пожалуйста, предоставьте некоторые известные решения. Он должен соответствовать хорошему шаблону проектирования, такому как MVVM или MVC, и не должен быть обходным путем или взломом. Может быть, делегаты будут работать? Я знаю, что rxSwift решит мою проблему, потому что я мог бы начать наблюдать за результатами после инициализации viewController и после обновления данных из репозитория, мой viewController также будет уведомлен ...

1 Ответ

0 голосов
/ 03 ноября 2018

Правильный дизайн не имеет VC, наблюдающих за сетевыми клиентами напрямую. Эти сетевые операции должны быть сборкой частей модели , что действительно важно для VC. Пусть VC соблюдает эту единственную модель.

Он может делать это, наблюдая, используя один из хорошо известных шаблонов для слабосвязанной связи между объектами. ОП правильно упоминает делегатов. Центр уведомлений и КВО другие. На SO много дискуссий о том, что использовать и как реализовать. (Я бы назвал NSNotificationCenter простым и рациональным началом).

Таким образом, порядок работы такой:

  1. выделяем модель
  2. запуск сетевых запросов и настройка этих завершений запросов (вероятно, блоков завершения) для обновления этой модели своими ответами. (модель может запускать запросы, что является разумной практикой).
  3. создать контроллеры представления, которые настраивают наблюдение модели при их инициализации (возможно, в viewWillAppear или позже)

А как насчет того, что> 1 запрос находится в полете одновременно? Приведенный выше комментарий правильно указывает, что GCD предлагает способ сгруппировать эти асинхронные операции в одну. Но вы можете сделать это сами: модель решит, когда она будет полностью построена. Код завершения для каждого запроса изменит некоторое условие в модели на состояние «готово». Каждое завершение запроса может проверять, соблюдены ли все условий готовности, и только затем отправлять «готовое» уведомление для просмотра наблюдателями.

Еще одна проблема: что если все эти запросы выполняются очень, очень быстро? Может быть, есть какой-то кешированный ответ, который готов на ранней стадии, что делает модель «готовой» до того, как у ВК будет возможность настроить наблюдение? Обработайте это прямо в VC: перед наблюдением модели проверьте, готова ли она уже, и запустите тот же код обновления, который выполняется в уведомлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...