2013-06-25 2 views
0

У меня немного сложная проблема с таблицей, я настроил таблицу и дал ей количество разделов и количество строк в каждом разделе. На самом деле у меня нет данных для ячеек, они просто пусты.Динамический источник данных UITableView

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

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

Любые идеи или предложения?

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableView *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // Pull data for next 50 table view cells 
    // The data will come from a server 

    return cell; 
} 
+0

Его следует вызывать только тогда, когда UITableView решает, что строка необходима. Попробуйте некоторые NSK, чтобы посмотреть, что происходит на самом деле. – Undo

+0

Вы можете проверить 'indexPath', чтобы определить, находитесь ли вы в первой строке или в последней строке. Если вы находитесь в последней строке, повторите запрос, если нет, не делайте этого. – danypata

ответ

4

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

Это тот тип картины, который вы ищете, или у вас был более конкретный вопрос о вашем подходе?

+0

@Vikings Я предлагаю, чтобы вместо выполнения сетевых запросов внутри '-tableView: cellForRowAtIndexPath:' вы должны уведомить какой-либо другой объект, чья ячейка просматривает пользователь, и разрешить этому объекту решить, какие запросы требуют дополнительных данных в результате. Делегат табличного представления может реализовать «-tableView: willDisplayCell: forRowAtIndexPath:», что было бы лучшим местом для идентификации, когда ячейка станет видимой, и подумайте о том, чтобы запросить больше. – Jonah

+0

Я обычно делаю это, как предлагает @Jonah. Всегда иметь последнюю ячейку - специальную ячейку, которая при прокрутке в представлении с помощью метода делегата 'tableView: willDisplayCell: forRowAtIndexPath:' вызывает загрузку следующих 50 элементов. Я обычно кладу в него загрузочный счетчик. – Dennis

+0

Спасибо, я пошел с решением, очень похожим на это. – Vikings