У меня есть что-то странное с перекрашиванием моего контроллера вида. Контроллер представления содержит 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 симулятор.