Полагаю, это не правильный способ думать о проблеме. Архитектурно, предоставляя знание модели данных контроллера табличного представления, вы связываете свой уровень модели со своим уровнем контроллера. Нарушение разделения интересов - это плохо.
В Какао использование объектов делегатов используется повсеместно. Объект делегата - это объект, который реализует определенный протокол с методами обратного вызова, которые могут быть вызваны, когда происходят вещи или события (например, загрузка данных из удаленного местоположения, в вашем случае). Я рекомендую вам создать свойство делегата в вашей модели данных, иметь интерфейс, который реализует mainTableViewController
(или любой другой класс, действительно), и назначить этот класс в качестве делегата. Затем, когда данные будут загружены, вызовите соответствующий метод на self.delegate
. В этом методе обратного вызова вы можете вызвать [tableView reloadData]
.
Опять же, вы не хотите, чтобы ваша модель данных была связана (имеется в виду) с существованием классов вашего контроллера.
Редактировать
Я только что перечитал последнюю часть вашего вопроса о наличии нескольких контроллеров таблиц, которые должны прослушивать уведомления о завершении загрузки данных. Для этого я предлагаю вам использовать Observer pattern в Какао, используя NSNotificationCenter
. Вы используете центр уведомлений в модели данных для отправки уведомлений наблюдателям (вам все равно, кто наблюдает; центр уведомлений обрабатывает эти детали), и вы также используете его в контроллерах своей таблицы, чтобы подписаться на уведомление. Делегаты - это хорошее, простое решение, если вам нужен только один объект для непосредственного вызова, когда что-то происходит. Уведомления более сложны и имеют больше накладных расходов, но дают вам возможность иметь произвольное количество объектов, «прослушивающих» уведомление для публикации.
Последующий ответ
Класс не определяет неформальный протокол; разработчик делает. Вы также можете определить формальный протокол в отдельном файле .h
и заставить контроллер реализовать его, если вы хотите принудительно заключить контракт. С формальным протоколом вы также можете использовать @optional
для методов, которые не должны быть реализованы классом, соответствующим протоколу.
Также неплохо создать экземпляр модели данных из контроллера табличного представления. На самом деле, это один очень правильный способ сделать это. Поскольку модель данных существует для инкапсуляции данных, которые (предположительно) контроллер захочет отобразить позже, вы можете думать о контроллере как о владельце модели данных. Вы можете даже подумать о создании переменной экземпляра (и, возможно, свойства) для хранения вашей модели данных. Кроме того, ваш переписанный код выглядит хорошо для меня!