需要在 Swift 中点击以停止密集型功能

Need to stop an intensive function with a tap in Swift

我有一个功能可以分析相机中的当前图像,然后每秒在屏幕上显示分析结果。但是,图像分析非常占用内存,我希望能够随时停止该过程并检索屏幕上的数据。我使用 UITapGestureRecognizer 监听点击并尝试 "freeze" 屏幕上的分析。

问题是,UITapGestureRecognizer 等待内存密集型功能完成,因此会冻结屏幕并进行 NEXT 分析,而不是我点击它时出现在屏幕上的那个。

有没有办法在用户点击屏幕时暂停或退出某个功能?

这是我当前的代码:

var analyzedText:String
var didTap:Bool
var savedText:String

func timerCalled(timer:NSTimer) {    // timer is on 1 second delay
    let image = capturePhoto()
    if (didTap) {
        savedText = label.text       // "freeze" it
    }
    let text = analyze(image)        // memory-intense function
    label.text = text                // update UILabel
    didTap = false
}

func didTap(tapGR: UITapGestureRecognizer) {
    didTap = true
}

savedText 一直是出现的下一个值,而不是点击屏幕时 label.text 的值。

感谢任何帮助。

当 运行 繁重的操作时,您应该始终使用后台线程。

DispatchQueue.global(qos: .background).async {
    let text = analyze(image)    

    DispatchQueue.main.async {
        // If you do any updates to the user interface they need to go here so that it's put back on the main thread.
        label.text = text           
    }
}

但是暂停操作是另一回事。您将必须在分析循环中执行暂停操作。不过,前面的背景确实可以帮助您避免阻塞 UI。

要在您的分析中实现一些暂停功能,您需要在您的函数中的某些点检查用户是否请求暂停,如果发生这种情况,您需要保存分析状态并退出操作.然后,如果操作要再次启动,您将从暂停时保存的状态恢复。