IOS сетевой код в модели? - PullRequest
       6

IOS сетевой код в модели?

6 голосов
/ 06 декабря 2010

Недавно я смотрел видео «Сетевые приложения для iPhone OS» для WWDC 2010 в iTunes U, и оратор сказал, что лучшее место для написания вашего сетевого кода - модель. Это меня смутило, потому что я всегда помещал этот код в классы контроллера. Может кто-нибудь объяснить, почему это лучшее место для сетевого кода? Также, если возможно, предоставьте пример, код или псевдокод, либо работает.

Ответы [ 6 ]

9 голосов
/ 06 декабря 2010

Интересно, мы все используем одинаковую терминологию? Вот что я бы использовал, и я думаю (хотя я говорю это без особого контекста), что имел в виду ведущий WWDC:

  • Модель. Данные
  • вид. Как это выглядит в пользовательском интерфейсе
  • контроллер. Слой, который является посредником между моделью и представлением

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

Конечно, нет причин, по которым у вас не может быть нескольких классов для вашей модели: один для представления данных, а другой - для посредничества между вашим веб-сервисом и моделью данных. В этом смысле это будет контроллер, но, тем не менее, он будет находиться на уровне модели приложения.

5 голосов
/ 06 декабря 2010

Я думаю, что модель - это ужасное место для реализации любого вида сетевого кода. Поскольку сетевые операции должны выполняться асинхронно, объект контроллера лучше всего подходит для обработки сложностей, связанных с отправкой запросов и обработкой ответа. Для объекта модели имеет смысл знать, как создать себя из загруженных данных (например, XML или JSON), но большая часть кода служб, который я видел в объектах модели, является плохо написанной, синхронной сетью.

2 голосов
/ 06 декабря 2010

Что называется моделью вызова в этом посте, на самом деле это уровень домена, а не контейнер данных, используемый между контроллерами и представлениями

Работа сети обычно асинхронна, и ваша модель, скорее всего,присутствовать для обработки ответа, в то время как ваш контроллер мог быть разрушен вашей навигацией между запросом и ответом.Это может привести к сбою приложения, поскольку делегат (контроллер в вашем случае) больше не присутствует в памяти и, по крайней мере, создает утечку памяти, поскольку делегат обычно отвечает за освобождение объекта соединения.

2 голосов
/ 06 декабря 2010

Хммм ... это кажется довольно странным замечанием, но опять же, может быть, оно действительно в некоторых контекстах.Конечно, я знаю, что мои модели в конечном итоге содержат много сетевого кода;

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

В частях модели может вообще не быть сетевого кода, если данные локальные.Но учтите, что сетевой код используется для передачи данных откуда-то в другое место;Если вы сначала программируете на основе моделей, то, вероятно, из этого следует, что почти весь ваш сетевой код окажется там.

1 голос
/ 25 июня 2014

« сеть лучше всего делать в модели », как вы прямо сказали, сетевой гуру Apple Куинн Эскимос во время сессии WWDC 2010. Недавно, закончив два довольно крупных приложения с обширной сетью, я очень хочу попробовать что-то другое в своем следующем проекте в соответствии с рекомендациями Apple.

Тем не менее, странно, что в целом вы можете найти тонны ресурсов по разработке под iOS, но с этим я действительно изо всех сил пытался найти любую информацию. То есть поиск по сетевой архитектуре iOS, работа в сети в модели и так далее. Это было до тех пор, пока я недавно не опубликовал аналогичный вопрос на форумах разработчиков Apple. Куинн предоставил очень полезный ответ. Вы можете прочитать его здесь: LinkedImageFetcher и сетевой код в модели

Куинн отметил, что лучшим примером для демонстрации является MVCNetworking

Кроме того, несмотря на то, что у него не было времени обновить образец с помощью Core Data, NSURLSession и т. Д., Он по-прежнему чувствует, что « базовая архитектура MVCNetworking довольно надежна ».

Наконец, на этот пост также ссылались; Похоже, у него есть действительно классные ссылки:

MVCСеть на iOS 5

0 голосов
/ 15 сентября 2015

Работа в сети, анализ, ecc ... конечно, входят в часть модели приложения ... Под моделью я подразумеваю часть шаблона MVC не строго на объекте представления модели.

Я подумаю построить такую ​​структуру:

Когда контроллер запрашивает некоторые данные для модели, у него есть зависимость от своего рода Network Manager, теперь единственная модель, которую нужно сделать, - это вызвать в нем метод (указанный в протоколе) и дождаться ответа (очевидно асинхронный). Network Manager имеет ссылку на указанный класс, который отвечает за выполнение сетевого вызова и возврат необработанных данных, когда при запуске блока завершения запускается Network Manager передает эти данные объекту Parser (очевидно, с помощью метода, указанного в протоколе) , дождитесь ответа, и когда данные извлечены и проанализированы, возвращает массив, словарь или то, что вам нужно для модели с новыми данными, обновленными в ней, после всего этого можно передать обратно в контроллер для создания reloadData или чего-то подобного и обновите представления обновленными данными.

Надеюсь, будет полезно.

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