swift - 在 iOS 中将图像转换为视频而不锁定 UI 线程 (Swift)

标签 swift multithreading grand-central-dispatch

我正在尝试将图像快照转换为视频,但遇到 UI 线程问题:我的 View Controller 被锁定。我想知道如何处理这个问题,因为我做了很多研究并尝试将进程分离到不同的 DispatchQueues 中,但它们都不起作用。因此,它解释了为什么我在下面的代码中没有使用任何队列:

class ScreenRecorder {
func renderPhotosAsVideo(callback: @escaping(_ success: Bool, _ url: URL)->()) {
        var frames = [UIImage]()
        for _ in 0..<100 {
            let image = self.containerView.takeScreenshot()
            if let imageData = UIImageJPEGRepresentation(image, 0.7), let compressedImage = UIImage(data: imageData) {
                frames.append(compressedImage)
            }
        }
        self.generateVideoUrl(frames: frames, complete: { (fileURL: URL) in
            self.saveVideo(url: fileURL, complete: { saved in
                print("animation video save complete")
                callback(saved, fileURL)
            })
        })
    }
}

extension UIView {
    func takeScreenshot() -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
        let image = renderer.image { _ in
            self.drawHierarchy(in: self.bounds, afterScreenUpdates: true)
        }
        return image
    }
}

class ViewController {
let recorder = ScreenRecorder()

        recorder.renderPhotoAsVideo { success, url in

            if (success) {
                print("ok")
            } else {
                self.alert(title: "Erro", message: "Nao foi possivel salvar o video", block: nil)
            }
        }
}

PS:我引用了这个教程 -> http://www.mikitamanko.com/blog/2017/05/21/swift-how-to-record-a-screen-video-or-convert-images-to-videos/

最佳答案

看起来这确实是不可能的,至少不是您尝试的方式。 有很多方法可以将 UIView 的内容渲染为图像,但所有这些都必须仅在主线程中使用。这也适用于您正在使用的 drawInHierarchy 方法。

由于您必须在主线程上调用它,并且该方法被调用了很多次,所以我认为这永远不会以高性能的方式工作。

查看仪器中的分析: enter image description here

来源:

关于swift - 在 iOS 中将图像转换为视频而不锁定 UI 线程 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49083750/

相关文章:

swift - NSDate 忽略时区

c# - 如何中止在另一个函数内启动的线程?

swift - 如何在主线程中同步运行多个方法?

swift - 变量崩溃代码

swift - 将一个 swift 变量绑定(bind)到另一个变量

ios - UITableViewCell 的详细文本标签在滚动时消失

multithreading - Adobe Air 桌面应用程序挂起(无响应)

multithreading - 在多个线程中改变共享可变变量

c - Ubuntu 库分发

ios - 在 dispatch_queue_t 上调用执行是否确保它们在同一个线程上?