Быстрое добавление V C изнутри закрытия не работает - PullRequest
0 голосов
/ 18 июня 2020

Итак, я пытаюсь отобразить представление загрузки, когда пользователь нажимает кнопку. Ниже представлена ​​функция

    /// Handles the shutter button tapped
    @objc func shutterTapped() {
        let parent = self.parent as! CameraActionViewController

        if parent.timerEngine.currentTime != 0 { parent.timerEngine.presentTimerDisplay() }
// This acts as a timer for the shutter to fire. (like a timer function for a camera)
        DispatchQueue.main.asyncAfter(deadline: .now() + Double(parent.timerEngine.currentTime)) {

            parent.cameraManager.capturePictureWithCompletion({ result in
                switch result {
                case .failure:
                    AlertHelper.shared.presentDefault(title: "Error", message: "Looks like there was an error capturing the image.", to: self)

                case .success(let content):
                    let loadingVC = LoadingViewController()
                    parent.parent!.addVC(loadingVC)
                    print("processing...")

                    if let image = content.asImage {
                        guard let editedImage = FilterEngine.shared.process(originalImage: image) else {
                            TapticHelper.shared.errorTaptic()
                            return
                        }

                        guard let data = editedImage.jpegData(compressionQuality: 1.0) else {
                            TapticHelper.shared.errorTaptic()
                            return
                        }

                        DataEngine.shared.save(imageData: data)
                        print("Success")
                        TapticHelper.shared.successTaptic()
                        loadingVC.removeVC()
                    }
                }
            })
        }
    }

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

let loadingVC = LoadingViewController()
parent.parent!.addVC(loadingVC)
...
loadingVC.removeVC()

Метод для добавления находится здесь:

    func addVC(_ child: UIViewController) {
        addChild(child)
        view.addSubview(child.view)
        child.didMove(toParent: self)
    }

    func removeVC() {
        guard parent != nil else { return }

        willMove(toParent: nil)
        view.removeFromSuperview()
        removeFromParent()
    }

Но по какой-то причине посмотреть на всех. Затем я обнаружил, что он каким-то образом выполняется после строки DataEngine.shared.save(imageData: data) (добавление к V C). Поэтому, поскольку он добавляет и удаляет одновременно, он ничего не показывает.

Есть помощь?

1 Ответ

2 голосов
/ 18 июня 2020

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

DispatchQueue.main.async {
    parent.parent!.addVC(loadingVC)
}

И:

DispatchQueue.main.async {
    loadingVC.removeVC()
}

Или просто поместите все в основную очередь сразу после завершения фоновой задачи:

parent.cameraManager.capturePictureWithCompletion({ result in
    DispatchQueue.main.async {
        //...
    }
}
...