more mention progress

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2022-05-07 13:50:19 -07:00
parent 73652513d9
commit 0eb1372937
21 changed files with 611 additions and 144 deletions

View File

@@ -9,62 +9,6 @@ import Foundation
import UIKit
import Combine
class ImageCache {
private let lock = NSLock()
lazy var cache: NSCache<AnyObject, AnyObject> = {
let cache = NSCache<AnyObject, AnyObject>()
cache.totalCostLimit = 1024 * 1024 * 100 // 100MB
return cache
}()
func lookup(for url: URL) -> UIImage? {
lock.lock(); defer { lock.unlock() }
if let decoded = cache.object(forKey: url as AnyObject) as? UIImage {
return decoded
}
return nil
}
func remove(for url: URL) {
lock.lock(); defer { lock.unlock() }
cache.removeObject(forKey: url as AnyObject)
}
func insert(_ image: UIImage?, for url: URL) {
guard let image = image else { return remove(for: url) }
let decodedImage = image.decodedImage(Int(PFP_SIZE!))
lock.lock(); defer { lock.unlock() }
cache.setObject(decodedImage, forKey: url as AnyObject)
}
subscript(_ key: URL) -> UIImage? {
get {
return lookup(for: key)
}
set {
return insert(newValue, for: key)
}
}
}
func load_image(cache: ImageCache, from url: URL) -> AnyPublisher<UIImage?, Never> {
if let image = cache[url] {
return Just(image).eraseToAnyPublisher()
}
return URLSession.shared.dataTaskPublisher(for: url)
.map { (data, response) -> UIImage? in return UIImage(data: data) }
.catch { error in return Just(nil) }
.handleEvents(receiveOutput: { image in
guard let image = image else { return }
cache[url] = image
})
.subscribe(on: DispatchQueue.global(qos: .background))
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
}
class Profiles: ObservableObject {
@Published var profiles: [String: TimestampedProfile] = [:]