12

私はswift 2.3UIFeedback Haptic Engineのように使用しています:

let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.Warning)

let generator = UIImpactFeedbackGenerator(style: .Heavy)
generator.impactOccurred()

今日、このような新しい種類のエラーが発生しましたが、問題が見つかりませんでした。何か考えはありますか?

UIFeedbackHapticEngine _deactivate] called more times than the feedback engine was activated

詳細:

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:]
4

3 に答える 3

1

すでに与えられた答えを完成させるために:あなたがしたいことは、FeedbackGeneratorの関数を呼び出すために常に使用されるOperationQueueまたはDispatchQueueのいずれかを持つことです。ユースケースでは、ジェネレーターを解放する必要があるかもしれませんが、最小限の例は次のようになることに注意してください。

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()
        }
    }

}

これにより、本番環境での関連するクラッシュがほぼ解決されました。

于 2020-10-06T15:49:10.787 に答える