Дорогой Джеймс,
Я думаю, что вы хотели бы поближе взглянуть на парадигму Model-View-Controller. В своем приложении вы пытаетесь реализовать своего рода «суперкласс». Позвольте мне объяснить, что это значит:
В вашем классе MainViewController, который явно является контроллером, есть также некоторая часть реализованной модели. Это плохая идея, но очень распространенная в начале. Может быть, я неправильно понял ваш дизайн, но вот как я бы его реализовал:
Модель Я бы реализовал правильный объект модели, который в вашем случае мог бы быть таким же простым, как пользовательский подкласс NSObject
с NSMutableArray
в качестве свойства. Кроме того, в этой модели будут реализованы методы извлечения данных из Интернета. Это правильно: сделать сеть в модели. Вам нужно иметь такие методы, как - (void) refreshProductCode
, которые вы будете вызывать с вашего контроллера. Если вы хотите по-настоящему поработать, используйте NSOperation
для инкапсуляции загрузки (тогда вы будете использовать синхронный вариант NSURLConnection
, потому что сама операция уже выполняется асинхронно). Тогда было бы хорошо, если бы вы анализировали строка JSON занимает больше времени, также это выполняется в фоновом режиме, и ваш пользовательский интерфейс будет реагировать.
Итак, теперь модель загружает ваши вещи - отлично, но как я узнаю, когда это будет сделано? Ну, вы бы опубликовать уведомление от модели, как только это будет сделано. Что делать, если загрузка не удалась? Вы догадались, правильно: опубликуйте уведомление, что это не удалось.
Контроллер Контроллер, который должен отображать данные из модели, сначала должен получить объект модели. В этом случае объект модели является свойством вашего AppController. Контроллер затем имеет свойство для этого объекта модели и сохраняет его, чтобы объект модели не исчезал, пока контроллер живет. Затем контроллер также регистрирует уведомления модели. Так как же тогда будет работать типичная загрузка?
- Получить экземпляр объекта модели
- вызов
-(void) refreshProductCode
на модельном объекте
- отображать счетчик сетевой активности в строке состояния и ждать уведомлений
- когда пришло уведомление, при успешном обновлении пользовательского интерфейса и при неудаче перезапустите загрузку или отобразите примечание для пользователя. Также отключите счетчик сетевой активности.
Как вы перетасовываете данные между контроллерами представления? Контроллеры представления должны работать немного как мафия: каждый контроллер представления работает на основе необходимости знать. Например, если вы хотите, чтобы контроллер представления отображал детали вашего продукта, вы не передадите модель со всеми вашими продуктами в контроллер. Вместо этого у вас будет переменная экземпляра в контроллере подробного представления, содержащая только один объект модели продукта, который имеет всю информацию, такую как текст описания, фотография и т. Д. Крутая вещь в том, что если вы когда-нибудь захотите снова отобразить информацию о продукте в своем приложении, вы может повторно использовать этот контроллер представления, поскольку все, что ему нужно, это объект модели продукта, чтобы выполнить свою работу.