线程是否会影响程序的正常工作行为?

时间:2011-05-23 10:32:10

标签: iphone uitableview uiviewcontroller nsoperation

我有一个视图控制器,它是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工作得很好但是在我的自定义委托方法中,我已经调用推送控制器堆栈顶部的视图控制器,视图控制器正确初始化但新视图控制器没有被推入屏幕。 我不知道为什么这不起作用。

2 个答案:

答案 0 :(得分:1)

所有UI调用都必须从主线程进行,其中可能包括分配/初始化UI类。听起来您在自定义委托方法中违反了该规则。

答案 1 :(得分:0)

您应该只使用主线程中的UI。 因此,在您的委托方法中,您必须添加类似

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

或者您可以直接调用tableView的方法:

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