synchronize access to network_pull_date_cache with a queue, writes with barrier flag
This commit is contained in:
@@ -19,6 +19,12 @@ final class ProfileDatabase {
|
|||||||
private var persistent_container: NSPersistentContainer?
|
private var persistent_container: NSPersistentContainer?
|
||||||
private var background_context: NSManagedObjectContext?
|
private var background_context: NSManagedObjectContext?
|
||||||
private let cache_url: URL
|
private let cache_url: URL
|
||||||
|
|
||||||
|
/// This queue is used to synchronize access to the network_pull_date_cache dictionary, which
|
||||||
|
/// prevents data races from crashing the app.
|
||||||
|
private var queue = DispatchQueue(label: "io.damus.profile_db",
|
||||||
|
qos: .userInteractive,
|
||||||
|
attributes: .concurrent)
|
||||||
private var network_pull_date_cache = [String: Date]()
|
private var network_pull_date_cache = [String: Date]()
|
||||||
|
|
||||||
init(cache_url: URL = ProfileDatabase.profile_cache_url) {
|
init(cache_url: URL = ProfileDatabase.profile_cache_url) {
|
||||||
@@ -75,7 +81,11 @@ final class ProfileDatabase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func get_network_pull_date(id: String) -> Date? {
|
func get_network_pull_date(id: String) -> Date? {
|
||||||
if let pull_date = network_pull_date_cache[id] {
|
var pull_date: Date?
|
||||||
|
queue.sync {
|
||||||
|
pull_date = network_pull_date_cache[id]
|
||||||
|
}
|
||||||
|
if let pull_date {
|
||||||
return pull_date
|
return pull_date
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +97,9 @@ final class ProfileDatabase {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
network_pull_date_cache[id] = profile.network_pull_date
|
queue.async(flags: .barrier) {
|
||||||
|
self.network_pull_date_cache[id] = profile.network_pull_date
|
||||||
|
}
|
||||||
return profile.network_pull_date
|
return profile.network_pull_date
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +133,9 @@ final class ProfileDatabase {
|
|||||||
|
|
||||||
let pull_date = Date.now
|
let pull_date = Date.now
|
||||||
persisted_profile?.network_pull_date = pull_date
|
persisted_profile?.network_pull_date = pull_date
|
||||||
self.network_pull_date_cache[id] = pull_date
|
self.queue.async(flags: .barrier) {
|
||||||
|
self.network_pull_date_cache[id] = pull_date
|
||||||
|
}
|
||||||
|
|
||||||
try context.save()
|
try context.save()
|
||||||
}
|
}
|
||||||
@@ -146,7 +160,9 @@ final class ProfileDatabase {
|
|||||||
throw ProfileDatabaseError.missing_context
|
throw ProfileDatabaseError.missing_context
|
||||||
}
|
}
|
||||||
|
|
||||||
network_pull_date_cache.removeAll()
|
queue.async(flags: .barrier) {
|
||||||
|
self.network_pull_date_cache.removeAll()
|
||||||
|
}
|
||||||
|
|
||||||
let request = NSFetchRequest<NSFetchRequestResult>(entityName: entity_name)
|
let request = NSFetchRequest<NSFetchRequestResult>(entityName: entity_name)
|
||||||
let batch_delete_request = NSBatchDeleteRequest(fetchRequest: request)
|
let batch_delete_request = NSBatchDeleteRequest(fetchRequest: request)
|
||||||
|
|||||||
Reference in New Issue
Block a user