Что касается первой части вопроса, вы можете получить более MVC дизайн, если вы:
реализовать ваш JSON / NSURLConnection в классах моделей, которые также реализуют протокол делегата и выполняют всю необходимую обработку ответа;
при обработке ответа контроллеру представления отправляется сообщение; Вы можете либо определить собственный делегат для этого (т. е. конкретное сообщение, которое вы отправляете контроллеру, который определен в специальном протоколе), либо просто использовать уведомления, что обеспечивает большую развязку и, возможно, проще в реализации (но больше дорого во время выполнения);
ответственность контроллера представления после получения этого сообщения сводится к тому, чтобы пользовательский интерфейс обновлялся для отражения новых данных.
Что касается второй части вашего вопроса, то нормально, что табличное представление создает ячейки, как только ему нужно перерисовать себя, т. Е. До того, как появятся данные (поскольку это занимает время).
Что вам нужно сделать, так это дать столу нарисоваться пустым (возможно, с отображением «загружающего» бита пользовательского интерфейса) и вызвать reloadData
в таблице, когда контроллер представления уведомляется о том, что данные получены и обработаны.
Это будет вполне естественно, если вы будете следовать приведенным выше рекомендациям, чтобы сделать ваш дизайн более отделенным в соответствии с MVC.
РЕДАКТИРОВАТЬ: о вашем последнем вопросе:
Я не знаю, как и где вы создаете объект myArray
, но, как правило, я ожидаю, что он будет иваром вашего объекта источника данных (если я неправильно понимаю вещи); поэтому, когда вы впервые создаете его, вы должны убедиться, что он сохранен; позже вы отпустите его в dealloc
, когда закончите с вашим источником данных. Вы сохраняете myArray
одним из нескольких возможных способов, например:
myArray = [[NSArray alloc] init...];
в этом случае alloc
уже дает вам сохраненный объект; или:
myArray = [[NSArray arrayWith...] retain];
в этом случае вам нужно сохранить возвращаемый объект вспомогательным конструктором (который возвращает автоматически освобожденный объект);
self.myArray = [NSArray arrayWith...];
в этом случае вам не нужно сохранять, если свойство myArray
объявлено как retain
.
Во всех предыдущих случаях вы гарантируете, что количество сохраняемых объектов равно как минимум 1, чтобы в какой-то момент он не был освобожден платформой. Невыполнение этого условия означает, что в какой-то момент времени ваш объект будет автоматически освобожден, и это очень вероятно произойдет до ваших данных, то есть до выполнения tableView:cellForRowAtIndexPath
.
Надеюсь, это поможет ...