How to set CADisplayLink in Swift with weak reference between target and CADisplayLink instance

后端 未结 3 1098
梦如初夏
梦如初夏 2021-01-23 05:26

In Objective-C, we can init CADisplayLink with Proxy Pattern to break strong reference:

WeakProxy *weakProxy = [WeakProxy weakProxyForObject:self];
self.displayL         


        
3条回答
  •  Happy的楠姐
    2021-01-23 05:41

    This proxy class should just work. Don't forget to invalidate before the dealloc.

    import UIKit
    
    class CADisplayLinkProxy {
    
        var displaylink: CADisplayLink?
        var handle: (() -> Void)?
    
        init(handle: (() -> Void)?) {
            self.handle = handle
            displaylink = CADisplayLink(target: self, selector: #selector(updateHandle))
            displaylink?.add(to: RunLoop.current, forMode: .common)
        }
    
        @objc func updateHandle() {
            handle?()
        }
    
        func invalidate() {
            displaylink?.remove(from: RunLoop.current, forMode: .common)
            displaylink?.invalidate()
            displaylink = nil
        }
    }
    

    Usage:

    class ViewController: UIViewController {
    
        var displaylinkProxy: CADisplayLinkProxy?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            displaylinkProxy = CADisplayLinkProxy(handle: { [weak self] in
                self?.updateAnything()
            })
        }
    
        @objc func updateAnything() {
            print(Date())
        }
    }
    

提交回复
热议问题