Выполнение перехода внутри обработчика завершения

Я пытаюсь выполнить переход раскадровки внутри обработчика завершения следующим образом:

movieWriter.finishRecordingWithCompletionHandler({ () -> Void in
            //Leave this view
            self.performSegueWithIdentifier("decisionSegue", sender: self)
        })

и получаю следующее предупреждение:

Это приложение модифицирует движок автомакета из фонового потока, что может привести к повреждению движка и странным сбоям. Это вызовет исключение в будущем выпуске.

Обработчик завершения работает в фоновом режиме, поэтому я понимаю, почему я получаю эту ошибку, мой вопрос: каковы мои варианты выполнения этого перехода без получения этой ошибки?

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


person tnev    schedule 16.12.2015    source источник
comment
Я думаю, что это легко найти в Google. На 90% вопросов уже есть точные ответы.   -  person Muhammad Adnan    schedule 16.12.2015


Ответы (3)


Всякий раз, когда вы выполняете какую-либо операцию в пользовательском интерфейсе/активном представлении, она должна выполняться в основном потоке, а не в фоновом потоке.

Сделайте следующее:

__weak typeof(self) weakSelf = self; //Best practice
                                     //Provide a weak reference in block and not strong.

movieWriter.finishRecordingWithCompletionHandler({ () -> Void in

     dispatch_async(dispatch_get_main_queue(),{

        weakSelf.performSegueWithIdentifier("decisionSegue", sender:weakSelf)

     })            
})
person nikhil84    schedule 16.12.2015
comment
Все ответы помогли, так что спасибо всем, но вы использовали быстрый код, который я предоставил, и рекомендовали использовать слабое я, поэтому этот ответ помог мне больше всего. Спасибо! - person tnev; 17.12.2015

Поместите его в очередь отправки:

dispatch_async(dispatch_get_main_queue(),{
    self.performSegueWithIdentifier("decisionSegue", sender: self)
})

Надеюсь, это сработает

Для получения более подробной информации: Это приложение изменение механизма автомакета из фонового потока, что может привести к повреждению механизма и странным сбоям

person Ashish Kakkad    schedule 16.12.2015

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

Цель-C:

dispatch_async(dispatch_get_main_queue(), ^{
    // update some UI
    // Perform your Segue here
});

Быстрый:

DispatchQueue.main.async {
    // update some UI
    // Perform your Segue here    
}

Надеюсь, это поможет вам.

person Muhammad Waqas Bhati    schedule 16.12.2015