IPhone - Архитектура для viewController и сетевых запросов

Итак, у меня есть два типа данных, некоторые из них необходимо сохранить, а некоторые нет.

Я подумываю о том, где разместить весь мой связанный с сетью код, внутри моих UIViewControllers, где начинается весь сетевой запрос, или на другом уровне.

Я имел в виду следующее:

У вас есть слой с именем NetworkManager. NetworkManager является singerlton ко всем моим вызовам веб-службы.

Для данных, которые должны быть постоянными и могут быть представлены в списке, я хотел бы, чтобы диспетчер сети выдавал запрос, сохранял ответ в моей локальной базе данных данных, и мой UIViewController прослушивал эти данные, используя FetchResultsController.

Но есть много других типов запросов. Например: запрос на вход, запрос информации о пользователе, friendsNearBy и т.д. Некоторые из них не обязательно должны быть постоянными в моем db, а некоторые не соответствуют архитектуре FRC.

Для этого типа запроса, насколько я вижу, есть два способа его обработки:

1. Иметь другой слой, который разделяет ViewControllers и NetworkManager.   Позвольте называть его Mediator. Mediator получает запрос словаря (JSON) от networkManager, решает в соответствии с логикой приложения, если с ним что-то еще нужно сделать, а затем отправить уведомление с соответствующим именем и данными. Если посредник сохраняет UIViewController, который выдал запрос, он может делегировать ответ прямо ему, а не размещать уведомление.

Поток будет таким:

MyUiViewController - > Mediator -> NetworkManger->Mediator-> PostNotification (or directly back to MyUiViewController)

Pros:
Decoupling
Nice structure and separation of concerns

Cons:
Harder to code
Sometimes harder to understand and debug.

2. Не имея этой трехслойной архитектуры, но вместо этого MyUiViewControllers выдает сетевой запрос с блоками. Значение вместо того, чтобы посредник перехватывал ответ перед MyUiViewController, просто позвольте MyUiViewController обрабатывать ответ с помощью блоков, поскольку он тот, который его выдает.

Pros:
Simple and quick to code
Easy to understand

Cons:
Coupling of network code inside your controllers

Я надеялся получить предложения и комментарии о том, что лучше всего от людей, или о другом/лучшем способе сделать это.

Ответ 1

У вас есть лучший метод?

Вот что я делаю вообще,

У вас есть NetworkManager, который не является Singleton. Определить протокол с помощью метода OnSuccess, OnError. Внесите это в свой ViewController, который инициирует сетевое подключение. Установите делегата в NetworkManager и позвольте делегировать вызов при выполнении асинхронного запроса.

Используйте делегаты вместо блоков, поскольку их легко поддерживать.

Это может быть не лучшее решение, но, надеюсь, оно дает вам несколько указателей.

Ответ 2

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

Автоматическая загрузка: Основные данные приложения загружаются и сохраняются непосредственно в базе данных. Он запускается каждый раз, когда приложение становится активным. По мере того, как каждый запрос завершается, NSNotification отправляется для любых видимых контроллеров вида, которые могут нуждаться в информации о новых данных.

Например, если я сохраню данные игрока, я отправлю уведомление типа "PlayerDataUpdated". Когда отображается контроллер просмотра, он прослушивает уведомления. Когда он не отображается, он не прослушивает уведомления, так как любые изменения в базе данных будут обнаружены во время просмотраWillAppear.

Загруженные пользователи: Для пользовательских сетевых запросов, таких как pull to refresh, вы должны вызвать соответствующий метод в NetworkManager из контроллера представления, который нуждается в обновленных данных.