Могу ли я использовать фоновый поток для анализа данных? - PullRequest
1 голос
/ 06 августа 2011

Я использую chcsvparser для анализа данных из файла csv при запуске моих приложений.Запуск в главном потоке занимает слишком много времени, поэтому я думал об этом в фоновом потоке.Но я читал, что вы не можете передавать объекты между потоками.Парсер выводит NSArray, так есть ли способ сделать это?Я также читал, что вы не должны менять пользовательский интерфейс из фонового потока, но этот массив загрузит табличное представление.

Ответы [ 4 ]

8 голосов
/ 06 августа 2011

Вы всегда можете передавать объекты между потоками.

Используйте следующий код для создания потока и передачи ему объекта.

[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];
}

Вы можете показать действиеиндикатор, пока вы находитесь в потоке метод.

2 голосов
/ 06 августа 2011

Класс 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];    
}
0 голосов
/ 06 августа 2011

Для этой работы лучше использовать класс NSOperation.Вы можете найти хороший пример с именем "LazyTableImages" в документации XCode.Он использует NSOperation для анализа XML

0 голосов
/ 06 августа 2011

конечно, мы можем передавать объекты в поток ... перейдите по ссылке , которая показывает, как обрабатывать тяжелые задачи в фоновом режиме ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...