I\'m using chcsvparser to parse data from a csv file on my apps launch. It\'s taking way too long to startup on main thread so I was thinking of doing this on the backgroun
You can always pass objects between threads.
Use the following code to create a thread and pass the object to it.
[NSThread detachNewThreadSelector:@selector(myThreadSelector:) toTarget:self withObject:myObject];
After the thread function is over you can pass the data back to the main thread using
[self performSelectorOnMainThread:@selector(myMainSelector:) withObject:myReturnObject waitUntilDone:NO];
you can pass the output NSArray from the parser to myMainSelector: and reload the tableview in it.
-(void)myMainSelector:(id)sender
{
NSArray *arr = sender;
tableDataArray = [NSArray arrayWithArray:arr];
[yourTableView reloadData];
}
You can show an activity indicator while you are in the thread method.
ofcourse we can pass objects to thread... please go through the link which shows how to process heavy task in background...
It is better to use NSOperation class to do that job. You can find a nice example named "LazyTableImages" at XCode documentation. It is uses a NSOperation to parse a XML
The NSObject class has several different instance methods that allow you to invoke methods on the main UI thread. The performSelectorOnMainThread:withObject:waitUntilDone: method, for instance, allows you to invoke a method of the receiver on the main thread with the object of your choice.
Here's some code to get you started:
-(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];
}