У меня есть что-то странное с перекрашиванием моего контроллера вида.Контроллер представления содержит UITableView и счетчик.
У меня есть функция updateFeed (запущенная IBOutlet), которая выводит spinner перед моим контроллером представления ипомещает функцию 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 вызывает функцию parser (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 выполнен без ошибок, и благодаря моему классу Operation 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 в парсер функция, но не меняется.
Я, конечно, что-то не так понял, но я не знаю, что это ...
edit
Я изменил код, чтобы сделать его менее запутанным.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.