Best practices to use low-latency feature in UIUpdateLink?

Hi everyone,

I'm not an experienced developer. I'm interested in the low-latency related APIs in UIUpdateLink, but I failed to write even a minimal demo that works.

UIUpdateInfo.isImmediatePresentationExpected is always false here. My understanding must be wrong. I've totally no idea so I'm asking for help here. I appreciate anyone who gives suggestions of any kind.

Here's my (failed) demo about tracking touch inputs (of the 1st finger) and draw some shape at that place:

import UIKit

class ContentUIView: UIView {
    
    // MARK: - About UIUpdateLink and drawing
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        initializeUpdateLink()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        initializeUpdateLink()
    }
    
    private func initializeUpdateLink() {
        self.updateLink = UIUpdateLink(view: self)
        self.updateLink.addAction(to: .beforeCADisplayLinkDispatch,
                                  target: self,
                                  selector: #selector(update))
        self.updateLink.wantsImmediatePresentation = true
        self.updateLink.isEnabled = true
    }
    
    @objc func update(updateLink: UIUpdateLink,
                      updateInfo: UIUpdateInfo) {
        print(updateInfo.isImmediatePresentationExpected)   // FIXME: Why always false?
        CATransaction.begin()
        defer { CATransaction.commit() }

        layer.setNeedsDisplay()
        layer.displayIfNeeded()
    }

    override func draw(_ rect: CGRect) {
        // FIXME: Any way to support opacity?
        
        guard let context = UIGraphicsGetCurrentContext() else { return }
        context.clear(rect)

        guard let lastTouch = self.lastTouch else { return }
        let location = lastTouch.location(in: self)
        let circleBounds = CGRect(x: location.x - 16, y: location.y - 16, width: 32, height: 32)
        
        context.setFillColor(.init(red: 1/2, green: 1/2, blue: 1/2, alpha: 1))
        context.addLines(between: [])
        context.fillEllipse(in: circleBounds)
    }
    
    // MARK: - Touch input

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        guard lastTouch == nil else { return }
        lastTouch = touches.first
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        guard let lastTouch, touches.contains(lastTouch) else { return }
        self.lastTouch = nil
    }
    
    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.touchesEnded(touches, with: event)
    }
    
    private var lastTouch: UITouch?
    private var updateLink: UIUpdateLink!
}

#Preview { ContentUIView() }

Anyway, I'm not meant to find alternative APIs and I'd be willing to know what it can't do.

Best practices to use low-latency feature in UIUpdateLink?
 
 
Q