UIView и UITableView, странная задержка reloadData

У меня есть что-то странное с перекрашиванием моего контроллера вида. Контроллер представления содержит UITableView и счетчик.

У меня есть функция updateFeed (запущенная IBOutlet), которая выводит счетчик перед моим контроллером представления и помещает Функция doUpdate в NSOperationQueue.

- (void)updateFeed {
    [self showMuar];
    ResourceLoader *loader = [ResourceLoader sharedResourceLoader];
    [loader updateFeed:[self feed] forDelegate:self];
    isReloading = YES;
}
- (id<ResourceToken>)updateFeed:(Feed *)feed forDelegate:(id)delegate {
     return [self queueOperation:[[Operation alloc] initWithObject:feed withSelector:@selector(doUpdate) delegate:delegate]];
}

Функция doUpdate вызывает синтаксический анализатор (startParserWithAdd :), который извлекает контент из Интернета и форматирует его для UITableView и затем выполните [tableView reloadData] .

- (NSError *)doUpdate {
    [self startParserWithAddThreaded:NO];
    return nil;
}
- (void)startParserWithAddThreaded:(BOOL)add {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self startParserWithAdd:add];
    [pool release];
}

... где-нибудь в функции синтаксического анализатора (startParserWithAdd: )

[tableView setDataSource:self];
[tableView reloadData];

Когда doUpdate выполнено без ошибок, и благодаря моему классу операций loadingResourceDidFinish выполняется в моем контроллере представления. loadingResourceDidFinish отправляет счетчик в фоновом режиме.

- (void)loadingResourceDidFinish:(Feed*)f {
    isReloading = NO;
    [self loadingResourceDidFinishPostAction];
}
- (void)loadingResourceDidFinishPostAction {
        [self hideMuar];
}
- (void)hideMuar {
    [loadingIndicator stopAnimating];
    [self.view sendSubviewToBack:muar];
}

Все работает нормально, но счетчик отправляется в фоновый режим примерно через 4 с после loadingResourceDidFinish .

Кому точнее, muar - это UIView с непрозрачностью, который содержит счетчик. Я просто хотел абстрагироваться от сложности в своем первоначальном объяснении!

Я попытался NSLog это и похоже, что ничего не перекрашивается, пока reloadData не будет завершена. Я думаю, что это проблема перекраски, потому что, если я перевожу свой iPhone в альбомную ориентацию сразу после окончания loadingResourceDidFinish , все хорошо, блесна исчезает.

Я пытался удалить NSAutoreleasePool в функции парсера , но не изменился.

Я, конечно, что-то неправильно понял, но не знаю, что это ...


Редактировать

Я изменил код, чтобы сделать его менее запутанным. ReloadData объекта UITableView теперь размещен здесь:

- (void)loadingResourceDidFinishPostAction {
    [tableView reloadData];
    [self hideMuar];
    NSLog(@"loadingResourceDidFinishPostAction end");
}

И для отладки:

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"cellForRowAtIndexPath %i", indexPath.row);
        ...

Так почему первая ячейка перекрашивается только через 5 секунд после окончания загрузки ResourceDidFinishPostAction?

2010-09-02 10:15:35.279 myapp[9632:5b03] loadingResourceDidFinishPostAction end
2010-09-02 10:15:40.208 myapp[9632:5b03] cellForRowAtIndexPath 0
2010-09-02 10:15:40.697 myapp[9632:5b03] cellForRowAtIndexPath 1
2010-09-02 10:15:40.878 myapp[9632:5b03] cellForRowAtIndexPath 2

Это то же самое, что и в моем iPhone 3G и iPhone 4 симулятор.

9
задан lefakir 2 September 2010 в 13:32
поделиться