Don't use shared background context for fetching item counts
A significant fraction of the time was spent waiting for the background context to be available, before the count could even be started. Since the counts don't need to use the shared background context, let them each use their own context to avoid contention.
This commit is contained in:
parent
c78ed42a5e
commit
e264e8842c
|
@ -77,7 +77,7 @@
|
|||
</CommandLineArgument>
|
||||
<CommandLineArgument
|
||||
argument = "-com.apple.CoreData.SQLDebug 1"
|
||||
isEnabled = "YES">
|
||||
isEnabled = "NO">
|
||||
</CommandLineArgument>
|
||||
</CommandLineArguments>
|
||||
<EnvironmentVariables>
|
||||
|
|
|
@ -14,7 +14,7 @@ private let signposter = OSSignposter(subsystem: "net.shadowfacts.Reader", categ
|
|||
|
||||
class HomeCollectionViewCell: UICollectionViewListCell {
|
||||
|
||||
private var currentItemListType: ItemListType?
|
||||
private var currentItemCountTask: Task<Void, Never>?
|
||||
private var itemCount: Int?
|
||||
|
||||
#if !targetEnvironment(macCatalyst)
|
||||
|
@ -31,12 +31,11 @@ class HomeCollectionViewCell: UICollectionViewListCell {
|
|||
|
||||
override func prepareForReuse() {
|
||||
super.prepareForReuse()
|
||||
currentItemCountTask?.cancel()
|
||||
itemCount = nil
|
||||
}
|
||||
|
||||
func updateUI(item: ItemListType, persistentContainer: PersistentContainer) {
|
||||
self.currentItemListType = item
|
||||
|
||||
var config = UIListContentConfiguration.valueCell()
|
||||
config.text = item.title
|
||||
if let itemCount {
|
||||
|
@ -45,10 +44,10 @@ class HomeCollectionViewCell: UICollectionViewListCell {
|
|||
config.secondaryTextProperties.color = .tintColor
|
||||
self.contentConfiguration = config
|
||||
|
||||
Task(priority: .userInitiated) {
|
||||
let state = signposter.beginInterval("fetch count", id: signposter.makeSignpostID())
|
||||
currentItemCountTask = Task(priority: .userInitiated) {
|
||||
let state = signposter.beginInterval("fetch count", id: signposter.makeSignpostID(), "\(String(item.hashValue, radix: 16), privacy: .public)")
|
||||
if let count = await fetchCount(item: item, in: persistentContainer),
|
||||
self.currentItemListType == item {
|
||||
!Task.isCancelled {
|
||||
self.itemCount = count
|
||||
config.secondaryText = count.formatted(.number)
|
||||
self.contentConfiguration = config
|
||||
|
@ -62,9 +61,12 @@ class HomeCollectionViewCell: UICollectionViewListCell {
|
|||
return nil
|
||||
}
|
||||
return await withCheckedContinuation({ continuation in
|
||||
let context = persistentContainer.backgroundContext
|
||||
context.perform {
|
||||
let state = signposter.beginInterval("waiting to perform", id: signposter.makeSignpostID(), "\(String(item.hashValue, radix: 16), privacy: .public)")
|
||||
persistentContainer.performBackgroundTask { context in
|
||||
signposter.endInterval("waiting to perform", state)
|
||||
let state = signposter.beginInterval("count", id: signposter.makeSignpostID(), "\(String(item.hashValue, radix: 16), privacy: .public)")
|
||||
let count = try? context.count(for: request)
|
||||
signposter.endInterval("count", state)
|
||||
continuation.resume(returning: count)
|
||||
}
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue