Влияет ли многопоточность на нормальное рабочее поведение программы? - PullRequest
1 голос
/ 23 мая 2011

У меня есть контроллер представления, который является подклассом UIViewController, в котором есть табличное представление, и каждая строка в табличном представлении связана с отдельным xml-URL.Я создал класс синтаксического анализатора, который является подклассом NSOperation, и реализовал методы для синтаксического анализа XML-файла при выделении каждой строки следующим образом:

   -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[self performSelectorOnMainThread:@selector(pushView) withObject:nil waitUntilDone:NO];
[self performSelectorInBackground:@selector(parseOperation:) withObject:indexPath];
}

-(void)pushView{
detailView = [[viewDetailsController alloc] initWithNibName:@"viewDetailsController" bundle:nil];
[self.navigationController pushViewController:detailView animated:YES]; 
}

 -(void)parseOperation:(NSIndexPath *)indexPath{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
self.queue = [[NSOperationQueue alloc] init];
parserClass *parser = [[parserClass alloc] initWithParseUrl:[[self.arrayOfUrls objectAtIndex:indexPath.row]delegate:self];
[queue addOperation:parser];
[parser release];
[pool release];
}

Parser отлично работает, но в своем пользовательском методе делегата, который я вызвал для push viewконтроллер в верхней части стека навигационных контроллеров, контроллер представления инициализируется правильно, но новый контроллер представления не выдвигается на экран.Я понятия не имею, почему это не работает.

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Все вызовы пользовательского интерфейса должны выполняться из основного потока, который может включать в себя распределение / инициализацию классов пользовательского интерфейса.Похоже, вы нарушаете это правило в своем методе делегата.

0 голосов
/ 23 мая 2011

Вы должны работать с пользовательским интерфейсом только из основного потока.Таким образом, в вашем методе делегата вы должны добавить что-то вроде

[self performSelectorOnMainThread:@selector(showImage:) withObject:aImage waitUntilDone:NO];

Или вы можете вызвать метод tableView напрямую:

[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
...