Могу ли я использовать фоновый поток для анализа данных?
Я использую chcsvparser для анализа данных из файла CSV при запуске моих приложений. Запуск в главном потоке занимает слишком много времени, поэтому я думал об этом в фоновом потоке. Но я читал, что вы не можете передавать объекты между потоками. Парсер выводит NSArray, так есть ли способ сделать это? Я также читал, что вы не должны менять пользовательский интерфейс из фонового потока, но этот массив будет загружать табличное представление.
4 ответа
Класс NSObject имеет несколько различных методов экземпляра, которые позволяют вам вызывать методы в основном потоке пользовательского интерфейса. Например, executeSelectorOnMainThread: 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];
}
Вы всегда можете передавать объекты между потоками.
Используйте следующий код для создания потока и передачи ему объекта.
[NSThread detachNewThreadSelector:@selector(myThreadSelector:) toTarget:self withObject:myObject];
После завершения функции потока вы можете передать данные обратно в основной поток, используя
[self performSelectorOnMainThread:@selector(myMainSelector:) withObject:myReturnObject waitUntilDone:NO];
вы можете передать вывод NSArray из анализатора в myMainSelector: и перезагрузить в нем табличное представление.
-(void)myMainSelector:(id)sender
{
NSArray *arr = sender;
tableDataArray = [NSArray arrayWithArray:arr];
[yourTableView reloadData];
}
Вы можете показать индикатор активности, пока вы находитесь в методе потока.
Конечно, мы можем передавать объекты в поток... перейдите по ссылке, которая показывает, как обрабатывать тяжелые задачи в фоновом режиме...
Лучше использовать класс NSOperation, чтобы сделать эту работу. Вы можете найти хороший пример с именем "LazyTableImages" в документации XCode. Он использует NSOperation для анализа XML