Потоковая обработка iOS «Модифицирующий слой, который завершается»

#multithreading #ios #mbprogresshud

#многопоточность #iOS #mbprogresshud

Вопрос:

Я анализирую изображение, что занимает некоторое время, и тем временем я хочу отобразить индикатор выполнения. Для этого я использую MBProgressHUD.

Это почти работает… Я получаю эту ошибку: «Модифицирующий слой, который завершается». Я предполагаю, что это связано с тем, что я использую pushViewController не в моем основном потоке. Я прав? Есть идеи о том, как исправить эту проблему?

Мой код:

 - (IBAction)buttonReadSudoku:(id)sender
{    
    mbProgress=[[MBProgressHUD alloc] initWithView:self.view];
    mbProgress.labelText=@"Läser Sudoku";
    [self.view addSubview:mbProgress];
    [mbProgress setDelegate:self];

    [mbProgress showWhileExecuting:@selector(readSudoku) onTarget:self withObject:nil animated:YES];
}

- (void)readSudoku
{
    UIImage *image = imageView.image;
    image = [ImageHelpers scaleAndRotateImage:image];
    NSMutableArray *numbers = [SudokuHelpers ReadSudokuFromImage:image];

    sudokuDetailViewController = [[SudokuDetailViewController alloc] init];
    [sudokuDetailViewController setNumbers:numbers];

    [[self navigationController] pushViewController:sudokuDetailViewController animated:YES];
}
  

Ответ №1:

Определите новый метод для запуска вашего контроллера просмотра деталей и используйте -performSelectorOnMainThread:withObject:waitUntilDone: для выполнения его в главном потоке. Не пытайтесь вносить какие-либо изменения в пользовательский интерфейс из других потоков.

Ответ №2:

Как вы заметили, все изменения пользовательского интерфейса должны быть в основном потоке. Вместо того, чтобы вносить какие-либо изменения в пользовательский интерфейс вне основного потока, отправьте NSNotification текущему ViewController с указанием ему выполнить работу пользовательского интерфейса.

Это особенно хороший маршрут, если вы пересекаете границу MVC или если у вас уже есть ViewController, который знает, что делать, чтобы написание отдельного метода приводило к дублированию кода.