Как я могу дождаться завершения двух отдельных задач UIGraphicsImageRenderer?

У меня есть 2 задачи UIGraphicsImageRenderer с разными средствами визуализации, и когда я запускаю это, возвращается только одна задача, поскольку она синхронна, как мне дождаться, пока обе создадут изображения, прежде чем возвращать их?

      func createShareImage(callback: @escaping (_ image: UIImage, _ bgImage: UIImage) -> Void) {

    let canvas = UIView()
    ...

    let format = UIGraphicsImageRendererFormat()
    format.scale = UIScreen.main.scale

    let renderer = UIGraphicsImageRenderer(size: canvas.bounds.size, format: format)
    let stickerImage = renderer.image { _ in
        canvas.drawHierarchy(in: canvas.bounds, afterScreenUpdates: true)
    }

    let bgImageView = UIView()
    ...

    let bgRenderer = UIGraphicsImageRenderer(size: bgImageView.bounds.size, format: format)
    let bgImage = bgRenderer.image { _ in
        bgImageView.drawHierarchy(in: bgImageView.bounds, afterScreenUpdates: true)
    }

    callback(stickerImage, bgImage)
    
}

1 ответ

Тестирование вашего кода

      func createShareImage(callback: @escaping (_ image: UIImage, _ bgImage: UIImage) -> Void) {

    let canvas = UIView(frame: CGRect.init(x: 0, y: 0, width: 200, height: 200))
    canvas.backgroundColor = .red
    let format = UIGraphicsImageRendererFormat()
    format.scale = UIScreen.main.scale
    print("1:",Thread.isMainThread)
    let renderer = UIGraphicsImageRenderer(size: canvas.bounds.size, format: format)
    let stickerImage = renderer.image { _ in
        canvas.drawHierarchy(in: canvas.bounds, afterScreenUpdates: true)
        print("2:",Thread.isMainThread)
    }

    let bgImageView = UIView(frame: CGRect.init(x: 0, y: 0, width: 2000, height: 2000))
    bgImageView.backgroundColor = .green
    let bgRenderer = UIGraphicsImageRenderer(size: bgImageView.bounds.size, format: format)
    let bgImage = bgRenderer.image { _ in
        bgImageView.drawHierarchy(in: bgImageView.bounds, afterScreenUpdates: true)
        print("3:",Thread.isMainThread)
    }

    print("4:",Thread.isMainThread)
    callback(stickerImage, bgImage)
}

Получает

      1: true
2: true
3: true
4: true

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

Другие вопросы по тегам