This commit makes a few changes: - Link preview views are no longer cached, only the metadata. This fixes a memory leak when preview videos. It will keep playing the video forever eventually leading to a crash. This is fixed! - Cache the intrinsic height of previews, when loading notes it looks for the cached height so that things don't pop-in after the fact - Note artifacts and previews are set in the constructor instead of onAppear, this prevents the size from changing and popping after it has been loaded into the lazyvstack Changelog-Fixed: Fix memory leak with inline videos Changelog-Fixed: Eliminate popping when scrolling
46 lines
845 B
Swift
46 lines
845 B
Swift
//
|
|
// PreviewCache.swift
|
|
// damus
|
|
//
|
|
// Created by William Casarin on 2023-01-02.
|
|
//
|
|
|
|
import Foundation
|
|
import LinkPresentation
|
|
|
|
class CachedMetadata {
|
|
let meta: LPLinkMetadata
|
|
var intrinsic_height: CGFloat?
|
|
|
|
init(meta: LPLinkMetadata) {
|
|
self.meta = meta
|
|
self.intrinsic_height = nil
|
|
}
|
|
}
|
|
|
|
enum Preview {
|
|
case value(CachedMetadata)
|
|
case failed
|
|
}
|
|
|
|
class PreviewCache {
|
|
var previews: [String: Preview]
|
|
|
|
func lookup(_ evid: String) -> Preview? {
|
|
return previews[evid]
|
|
}
|
|
|
|
func store(evid: String, preview: LPLinkMetadata?) {
|
|
switch preview {
|
|
case .none:
|
|
previews[evid] = .failed
|
|
case .some(let meta):
|
|
previews[evid] = .value(CachedMetadata(meta: meta))
|
|
}
|
|
}
|
|
|
|
init() {
|
|
self.previews = [:]
|
|
}
|
|
}
|