задержка перед reloadData - PullRequest
       11

задержка перед reloadData

1 голос
/ 29 декабря 2011

Я загружаю 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];
    }); 

}

Это потому, что поток пользовательского интерфейса был занят, делая что-то и переключаясь на основной потокувеличил скорость?

...