2013-04-03 3 views
0

У меня возникли проблемы с отображением хода более длительного действия mainthread (должно быть в основном потоке).Состояние UIButton и ход селектора

Действие вызывается нажатием кнопки.

-(void)getCSVExport:(id)sender{ 
    ... 
    NSString *filePath = [path stringByAppendingPathComponent:fileName]; 
    NSData *csvData = [NSData dataWithContentsOfFile:filePath]; 
    if (nil == csvData) { 
     _progressView.hidden = NO; 
     [self.view bringSubviewToFront:_progressView]; 
     _progressView.progress = 0; 
     csvData = [self generateCSVExportForMonth:_monthToExportInt]; 
     [csvData writeToFile:filePath atomically:YES]; 
     _progressView.hidden = YES; 
    } 
    ... 
} 

в Funktion generateCSVExportForMonth: я обновление прогресса _progressView.progress = newValue.

я сейчас имею 2 проблемы:

1) при нажатии на кнопку, которая вызывает getCSVExport: кнопка остается подсвеченным, пока вызов не будет завершен. 2) progressView никогда не появляется, не говоря уже об обновлении.

информация: вызов занимает от 0,5 до 2 секунд в зависимости от устройства.

любые идеи, в которых я ошибся?

// EDIT: новая версия с backgroundThread:

[self.view bringSubviewToFront:_progressView]; 
_progressView.progress = 0; 
[self performSelector:@selector(assignCSVData:) onThread:[NSThread new] withObject:csvData waitUntilDone:YES]; 
_progressView.hidden = YES; 

и дорогой вызов времени:

-(void)assignCSVData:(NSData*)data{ 
    data = [self generateCSVExportForMonth:_monthToExportInt]; 
} 

это приводит в тупик на performSelector вызова.

ответ

2

Проблема в том, что ваш основной поток заблокирован. Именно в этом причина использования фоновых потоков для вещей, которые занимают больше времени, потому что вы не хотите, чтобы графический интерфейс зависал.

Я не понимаю, почему что-то вроде синтаксического анализа файла CSV абсолютно имеет, чтобы быть на главной теме. Вам нужно будет сделать это в фоновом режиме (или жить с плохим пользовательским интерфейсом замороженного графического интерфейса).

У вас есть несколько вариантов, как реально реализовать что-то подобное.

  • Использование NSObject «s performSelectorInBackground:withObject:

    Поместите код синтаксического анализа в отдельный метод и запустить его в фоновом потоке с помощью:

    [self performSelectorInBackground:@selector(parseMethod) withObject:csvData]; 
    

    В конце этого метода вы называете некоторый метод на основной поток, чтобы уведомить его о том, что синтаксический анализ завершен.

    [self performSelectorOnMainThread:@selector(parsingDone:) withObject:result waitUntilDone:NO]; 
    
  • Используйте Grand Central Dispatch (GCD) запустить код в фоновом режиме, используя синтаксис блока. Также довольно просто, но немного более сложный синтаксис и семантика мудры, если вы привыкли к Objective-C и API Cocoa.

  • Использовать NSOperation и NSOperationQueue. Наверное, немного накладных расходов для вашей цели. Хотя вы также можете легко добавить новую операцию в очередь, вызвав addOperationWithBlock без подкласса NSOperation.

+0

Моя проблема заключается в том, что метод, генерирующий файл csv, обращается к coredata. Из-за этого у меня были тупики из-за этого и они хотят избежать этого. позволяя пользователю ждать максимум 2 секунды один раз за всю жизнь приложения - отчет никогда не будет воссоздан, но сохранен и повторно использован - это был мой план обеспечения стабильности. другим способом является то, что мне нужно будет убедиться, что приложение остается в одном и том же месте (viewcontroller) до тех пор, пока отчет не будет создан, потому что он будет использоваться именно там:/если есть умный способ сделать это, я был бы рад, поскольку хорошо :) –

+0

Постоянно ли это связано с объектами Cora Data? Не можете ли вы просто получить нужные вам объекты и передать их в парсер в фоновом режиме? – DrummerB

+0

отчет принимает точно 5+ (numberOfDaysOfMonth) выборки, постоянно распространяемые по выполнению функции. Захваты сильно различаются между выборками объектов и объектов. из-за утомительной сортировки результатов получить все сразу было бы большой потерей производительности. –