我可以使用后台线程来解析数据吗?

时间:2011-08-06 06:46:23

标签: iphone objective-c multithreading xcode

我正在使用chcsvparser来解析我的应用启动时来自csv文件的数据。在主线程上启动时间太长,所以我想在后台线程上执行此操作。但我读到你无法在线程之间传递对象。解析器输出一个NSArray,有没有办法做到这一点?我还读过你不应该从后台线程更改UI,但是这个数组会加载一个表视图。

4 个答案:

答案 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