Я загружаю tableView, который заполняет некоторые его элементы из другого места ... Я использую NSNotificationCenter для отправки сообщения в контроллер представления для reloadData после загрузки данных в источник данных (NSMutableArray) ... Iесть несколько NSLogs, чтобы помочь с отладкой, и существует огромная задержка между тем, когда уведомление запускается и когда tableView фактически перезагружает данные ... Я думаю, что я проследил это до задержки в cellForRowAtIndexPath, который ничего не имеетВообще-то:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Configure the cell...
Line *theLine = [theInvoice.lines objectAtIndex: indexPath.row];
cell.textLabel.text = theLine.name;
cell.detailTextLabel.text = [NSString stringWithFormat: @"qty: %@; unit-price: $%@", theLine.quantity, theLine.unit_price];
cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
return cell;
}
У меня также есть счетчик NSLog источника данных NSMutableArray при получении уведомления, и он записывает правильное количество элементов ... затем примерно 2 секунды до перезагрузки tableView,Любые мысли о том, что может быть причиной этой задержки?
РЕДАКТИРОВАТЬ: Вот код для получения уведомления:
- (void)updateView:(NSNotification *)notification {
NSLog(@"Notification Received, new count: %d", [theInvoice.lines count]);
[self.tableView reloadData];
}
В методе viewDidLoad я подписываюсь на уведомление:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"updateRoot" object:nil];
ОБНОВЛЕНИЕ: я изменил свой updateView на это, и задержка резко уменьшилась:
- (void)updateView:(NSNotification *)notification {
NSLog(@"Notification Received, new count: %d", [theInvoice.lines count]);
//[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self.tableView reloadData];
});
}
Это потому, что поток пользовательского интерфейса был занят, делая что-то и переключаясь на основной потокувеличил скорость?