2015-05-06 2 views
1

В моем приложении каждая ячейка в UITableview нуждается в данных, полученных из API. Чтобы приложение выглядело быстрее, я получаю данные для одной ячейки за один раз и отображаю их с помощью [tableview reloadData]. Но при этом сам ViewController не отвечает. Я не могу нажать кнопку «Назад» или коснуться ячейки (для вызова didSelectRowAtIndexPath). Есть ли решение для этого? Я вызываю метод reloadData как этотВзаимодействие не работает, когда выполняется [tableview reloadData]

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
     dispatch_async(queue, ^{ 
      [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 
     }); 
+0

Попробуйте 'dispatch_after (dispatch_time (DISPATCH_TIME_NOW (int64_t) (1 * NSEC_PER_SEC)), dispatch_get_main_queue()^{ [Tableview reloadData]; }.),' – iphonic

+0

Это почти сработало. теперь я могу получить кнопку «Назад», чтобы ответить. но как только он достигнет предыдущего диспетчера представлений, приложение выйдет из строя. Можете ли вы подумать о какой-либо причине, которая может произойти? –

+0

Я хотел бы увидеть журнал сбоев для этого, это может быть вызвано чем-то другим, чем то, о чем вы думаете. – iphonic

ответ

4

Перезагрузите Tableview на главной теме:

dispatch_async(queue, ^{ 

// Perform background task. Call webservice etc 

       dispatch_async(dispatch_get_main_queue(),^
      { 
       // Perform UI related tasks 
       [tableView reloadData]; 
      } 

     }); 
0

Вы в настоящее время выполняет блок в спине, призывая выполнить метод в основном потоке ... Это является излишним, и вы должны просто позвонить [tableView reloadData]. Если вызов reloadData занимает так много времени, что он замораживает ваш пользовательский интерфейс (перезагрузка таблицы должна произойти в главном потоке пользовательского интерфейса и не может выполняться на обратной стороне), тогда вы можете сделать что-то неправильно.

Если любые сетевые вызовы выполняются синхронно в любом из методов представления делегата или источника данных таблицы, вы должны выполнить их в обратном порядке асинхронным образом, а затем только перезагрузить таблицу, когда запросы будут выполнены.

0

Это потому, что вы просто блокируя основной поток.
Вы говорите, что добавляете одно ячеечное время, я полагаю, что содержимое ячейки возвращается из одной веб-службы. Это не самый подходящий способ справиться с такой проблемой, также потому, что вы, вероятно, открываете множество подключений для загрузки данных, необходимых для заполнения табличного представления.
-reloadData следует использовать только тогда, когда вам необходимо обновить все содержимое табличного вида, если вы хотите добавить ячейки вовремя, вы должны использовать -insertRowsAtIndexPaths:withAnimation:, обернутый внутри -beginUpdates и -endUpdates.

0
int requiredNumberOfCells = 10; 
int currentNumberOfCells = 0; 
[tableView reloadData]; 
dispatch_queue_t tableviewcell = dispatch_queue_create("tableviewcell", NULL); 
dispatch_async(tableviewcell, ^{ 

for (int i = 1;i<=requiredNumberOfCells;i++){ 
//Fetch details for each cell here 
currentNumberOfCells = i; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [tableView reloadData]; 
    }); 
} 
}); 
Смежные вопросы