Я никогда раньше не использовал фоновые темы.У меня есть трудоемкие вычисления, в настоящее время выполняющиеся в основном потоке, который добавляет вывод данных в TERecord.Мой рабочий процесс по существу идет:
запуск длинного процесса… обновление графического интерфейса… запуск длинного процесса… обновление графического интерфейса… и т. Д.
В нескольких местах, где код производит (строковые) выходные данные, я обновляю пользовательский интерфейсвызывая мой метод addToRecord, показанный здесь:
-(void)addToRecord:(NSString*)passedStr:(BOOL)updateUI
{
NSRange endRange;
// add the passed text...
endRange.location = [[theOutputView textStorage] length];
endRange.length = 0;
[theOutputView replaceCharactersInRange:endRange withString:passedStr];
if(updateUI) // immediate GUI update needed...
{
// scroll window contents to BOTTOM of page...
endRange = NSMakeRange([[theOutputView string] length],0);
[theOutputView scrollRangeToVisible:endRange];
[theOutputView display];
}
}
Пока он выполняет свою работу, весь мой пользовательский интерфейс остается без ответа до тех пор, пока процесс, конечно, не завершится.Я знаю, что должен выполнять тяжелую работу на фоновом потоке, который я никогда раньше не использовал.Я выяснил часть проблемы при создании фонового потока, как показано ниже:
-(IBAction)readUserInput:(id)sender
{
// irrelevant code snipped for brevity
if([self checkForErrors] == NO)
{
[runButton setEnabled:NO];
[self performSelectorInBackground:@selector(runWorkThread) withObject:nil];
}
}
-(void)runWorkThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
[self runLongProcess];
[pool drain];
}
, но я просто не понимаю, как вызывать основной поток каждый раз, когда код встречает мой метод addToRecord,тогда как вернуть управление фоновому потоку?Другая возможность может состоять в том, чтобы удалить код updateUI из моего метода addToRecord и просто иметь основной поток, вызывающий этот код каждую секунду или около того, по таймеру?
Буду очень признателен за любой совет и пример кода.Спасибо!