首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIFeedback Haptic引擎调用次数超过被激活次数

UIFeedback Haptic引擎调用次数超过被激活次数
EN

Stack Overflow用户
提问于 2016-10-26 23:49:29
回答 3查看 3.3K关注 0票数 13

我使用的是带有UIFeedback Haptic EngineWavid2.3,如:

代码语言:javascript
复制
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.Warning)

代码语言:javascript
复制
let generator = UIImpactFeedbackGenerator(style: .Heavy)
generator.impactOccurred()

今天我遇到了这样一个新的错误,却找不到问题。你有什么想法吗?

代码语言:javascript
复制
UIFeedbackHapticEngine _deactivate] called more times than the feedback engine was activated

详细信息:

代码语言:javascript
复制
Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x1863e41c0 __exceptionPreprocess
1  libobjc.A.dylib                0x184e1c55c objc_exception_throw
2  CoreFoundation                 0x1863e4094 +[NSException raise:format:]
3  Foundation                     0x186e6e82c -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  UIKit                          0x18cc43fb8 -[_UIFeedbackEngine _deactivate]
5  UIKit                          0x18cad781c -[UIFeedbackGenerator __deactivateWithStyle:]
EN

回答 3

Stack Overflow用户

发布于 2016-10-27 09:53:17

UIImpactFeedbackGenerator不是线程安全的,所以要确保同步调用generator.impactOccurred(),而不是在dispatch_async或其他异步线程中调用。

票数 15
EN

Stack Overflow用户

发布于 2018-08-15 14:57:43

调用generator.impactOccurred()将在iOS 11.*上崩溃。您需要在主线程async上调用它。

代码语言:javascript
复制
let generator = UIImpactFeedbackGenerator(style: style)
generator.prepare()

DispatchQueue.main.async {
   generator.impactOccurred()
}
票数 6
EN

Stack Overflow用户

发布于 2020-10-06 15:49:10

为了完成已经给出的答案:您想要做的要么是拥有一个OperationQueue或一个DispatchQueue,它总是用于调用FeedbackGenerator的函数。请记住,对于用例,您可能需要释放生成器,但最起码的例子是:

代码语言:javascript
复制
class HapticsService {

    private let hapticsQueue = DispatchQueue(label: "dev.alecrim.hapticQueue", qos: .userInteractive)

    typealias FeedbackType = UINotificationFeedbackGenerator.FeedbackType

    private let feedbackGeneator = UINotificationFeedbackGenerator()
    private let selectionGenerator = UISelectionFeedbackGenerator()

    func prepareForHaptic() {
        hapticsQueue.async {
            self.feedbackGeneator.prepare()
            self.selectionGenerator.prepare()
        }
    }

    func performHaptic(feedback: FeedbackType) {
        hapticsQueue.async {
            self.feedbackGeneator.notificationOccurred(feedback)
        }
    }

    func performSelectionHaptic() {
        hapticsQueue.async {
            self.selectionGenerator.selectionChanged()
        }
    }

}

这在很大程度上解决了我们生产中的相关问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40273911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档