diff --git a/Riot/Modules/Room/VoiceMessages/VoiceMessageController.swift b/Riot/Modules/Room/VoiceMessages/VoiceMessageController.swift index f0d8a9158..1b072e445 100644 --- a/Riot/Modules/Room/VoiceMessages/VoiceMessageController.swift +++ b/Riot/Modules/Room/VoiceMessages/VoiceMessageController.swift @@ -67,7 +67,7 @@ public class VoiceMessageController: NSObject, VoiceMessageToolbarViewDelegate, _voiceMessageToolbarView.delegate = self - displayLink = CADisplayLink(target: WeakObjectWrapper(self), selector: #selector(handleDisplayLinkTick)) + displayLink = CADisplayLink(target: WeakDisplayLinkTarget(self, selector: #selector(handleDisplayLinkTick)), selector: WeakDisplayLinkTarget.triggerSelector) displayLink.isPaused = true displayLink.add(to: .current, forMode: .common) diff --git a/Riot/Modules/Room/VoiceMessages/VoiceMessagePlaybackController.swift b/Riot/Modules/Room/VoiceMessages/VoiceMessagePlaybackController.swift index 9a438f707..dd95edd7e 100644 --- a/Riot/Modules/Room/VoiceMessages/VoiceMessagePlaybackController.swift +++ b/Riot/Modules/Room/VoiceMessages/VoiceMessagePlaybackController.swift @@ -61,7 +61,7 @@ class VoiceMessagePlaybackController: VoiceMessageAudioPlayerDelegate, VoiceMess audioPlayer.registerDelegate(self) playbackView.delegate = self - displayLink = CADisplayLink(target: WeakObjectWrapper(self), selector: #selector(handleDisplayLinkTick)) + displayLink = CADisplayLink(target: WeakDisplayLinkTarget(self, selector: #selector(handleDisplayLinkTick)), selector: WeakDisplayLinkTarget.triggerSelector) displayLink.isPaused = true displayLink.add(to: .current, forMode: .common) diff --git a/Riot/Utils/WeakObjectWrapper.swift b/Riot/Utils/WeakDisplayLinkTarget.swift similarity index 66% rename from Riot/Utils/WeakObjectWrapper.swift rename to Riot/Utils/WeakDisplayLinkTarget.swift index a1a206abb..5cd2e2eb1 100644 --- a/Riot/Utils/WeakObjectWrapper.swift +++ b/Riot/Utils/WeakDisplayLinkTarget.swift @@ -20,19 +20,18 @@ import Foundation Used to avoid retain cycles by creating a proxy that holds a weak reference to the original object. One example of that would be using CADisplayLink, which strongly retains its target, when manually invalidating it is unfeasable. */ -class WeakObjectWrapper: NSObject { - - private weak var wrappedObject: AnyObject? - - init(_ object: AnyObject) { - wrappedObject = object +class WeakDisplayLinkTarget: NSObject { + private(set) weak var target: AnyObject? + let selector: Selector + + static let triggerSelector = #selector(WeakDisplayLinkTarget.handleTick(parameter:)) + + init(_ target: AnyObject, selector: Selector) { + self.target = target + self.selector = selector } - - override func responds(to aSelector: Selector!) -> Bool { - return (wrappedObject?.responds(to: aSelector) ?? false) || super.responds(to: aSelector) - } - - override func forwardingTarget(for aSelector: Selector!) -> Any? { - return wrappedObject + + @objc private func handleTick(parameter: Any) { + _ = self.target?.perform(self.selector, with: parameter) } }