UITableView и NXXMLParser ... Иерархия вызовов - PullRequest
0 голосов
/ 21 сентября 2010

Я застрял в странной ситуации, я получаю данные с веб-сайта, используя файлы XML, и я заполняю массив (тип NSMutableArray), который позже я использую для отображения данных в табличном представлении. Проблема в том, что функции, связанные с UITableView, вызываются раньше, и в это время массив не заполняется, что приводит к сбою программы. Когда эта функция выполняется, arrayData пуста, а функции count ничего не возвращают. Есть ли способ, которым я вызываю функции NSXMLParser раньше, чем функции UITableView.


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return [arrayData count];
}

Спасибо, Теймур

Ответы [ 2 ]

2 голосов
/ 21 сентября 2010

Массив вернул бы 0, если бы он существовал, но не содержал никаких объектов - поэтому приложение не должно аварийно завершать работу. Это означает, что ваш массив еще не был инициализирован. Вы вероятно добавили указатель на свой массив в качестве переменной экземпляра и, возможно, в качестве свойства, но вам все еще нужно создать фактический объект, на который должен указывать этот указатель.

Итак, если мы имеем дело со свойством подкласса viewcontroller, добавьте что-то вроде этого в ваш метод viewDidLoad:

NSMutableArray *newArray = [[NSMutableArray alloc] init];
self.arrayData = newArray;
[newArray release];
1 голос
/ 21 сентября 2010

Ваша ситуация совсем не странна - она ​​чрезвычайно распространена при разработке приложений с требованиями асинхронной загрузки данных.

NSXMLParser - это SAX (управляемый событиями) синтаксический анализатор - он будет анализировать данные, когда они будут доступны. Это зависит от вас, когда вы решите отобразить таблицу, но, очевидно, если вы попытаетесь отобразить ее до того, как станут доступны данные XML, вам придется предпринять шаги для предотвращения сбоя или, по крайней мере, плохого взаимодействия с пользователем. Обычно вы отображаете счетчик активности или сообщение «загрузка данных ...», пока данные не будут готовы, и в фоновом потоке загрузите XML. После загрузки поток BG должен сообщить потоку пользовательского интерфейса о готовности данных и, возможно, вызвать reloadData таблицы для загрузки данных.

...