Могу ли я использовать фоновый поток для анализа данных?

Я использую 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

Другие вопросы по тегам