// // HomeCollectionViewCell.swift // Reader // // Created by Shadowfacts on 1/9/22. // import UIKit import Fervor import Persistence import OSLog private let signposter = OSSignposter(subsystem: "net.shadowfacts.Reader", category: "HomeCollectionViewCell") class HomeCollectionViewCell: UICollectionViewListCell { private var currentItemListType: ItemListType? private var itemCount: Int? #if !targetEnvironment(macCatalyst) override func updateConfiguration(using state: UICellConfigurationState) { var backgroundConfig = UIBackgroundConfiguration.listGroupedCell().updated(for: state) if state.isHighlighted || state.isSelected { backgroundConfig.backgroundColor = .appCellHighlightBackground } else { backgroundConfig.backgroundColor = .appBackground } self.backgroundConfiguration = backgroundConfig } #endif override func prepareForReuse() { super.prepareForReuse() itemCount = nil } func updateUI(item: ItemListType, persistentContainer: PersistentContainer) { self.currentItemListType = item var config = UIListContentConfiguration.valueCell() config.text = item.title if let itemCount { config.secondaryText = itemCount.formatted(.number) } config.secondaryTextProperties.color = .tintColor self.contentConfiguration = config Task(priority: .userInitiated) { let state = signposter.beginInterval("fetch count", id: signposter.makeSignpostID()) if let count = await fetchCount(item: item, in: persistentContainer), self.currentItemListType == item { self.itemCount = count config.secondaryText = count.formatted(.number) self.contentConfiguration = config } signposter.endInterval("fetch count", state) } } private func fetchCount(item: ItemListType, in persistentContainer: PersistentContainer) async -> Int? { guard let request = item.countFetchRequest else { return nil } return await withCheckedContinuation({ continuation in let context = persistentContainer.backgroundContext context.perform { let count = try? context.count(for: request) continuation.resume(returning: count) } }) } }