我正在使用chcsvparser来解析我的应用启动时来自csv文件的数据。在主线程上启动时间太长,所以我想在后台线程上执行此操作。但我读到你无法在线程之间传递对象。解析器输出一个NSArray,有没有办法做到这一点?我还读过你不应该从后台线程更改UI,但是这个数组会加载一个表视图。
答案 0 :(得分:8)
您始终可以在线程之间传递对象。
使用以下代码创建一个线程并将对象传递给它。
[NSThread detachNewThreadSelector:@selector(myThreadSelector:) toTarget:self withObject:myObject];
线程功能结束后,您可以使用
将数据传回主线程[self performSelectorOnMainThread:@selector(myMainSelector:) withObject:myReturnObject waitUntilDone:NO];
您可以将输出NSArray从解析器传递给myMainSelector:并在其中重新加载tableview。
-(void)myMainSelector:(id)sender
{
NSArray *arr = sender;
tableDataArray = [NSArray arrayWithArray:arr];
[yourTableView reloadData];
}
您可以在线程方法中显示活动指示器。
答案 1 :(得分:2)
NSObject类有几种不同的实例方法,允许您在主UI线程上调用方法。例如,performSelectorOnMainThread:withObject:waitUntilDone:方法允许您使用您选择的对象在主线程上调用接收器的方法。
以下是一些可以帮助您入门的代码:
-(void) dataDoneLoading:(id) obj {
NSMutableArray *array = (NSMutableArray *) obj;
// update your UI
NSLog(@"done");
}
-(void) myThread:(id) obj {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *array = [[[NSMutableArray alloc]init ]autorelease];
// build up your array
[self performSelectorOnMainThread:@selector(dataDoneLoading:) withObject:array waitUntilDone:NO];
[pool release];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[NSThread detachNewThreadSelector:@selector(myThread:) toTarget:self withObject:nil];
}
答案 2 :(得分:0)
当然我们可以将对象传递给线程... please go through the link,它显示了如何在后台处理繁重的任务......
答案 3 :(得分:0)
最好使用NSOperation类来完成这项工作。 你可以在XCode文档中找到一个名为“LazyTableImages”的好例子。它使用NSOperation来解析XML