diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index d2700cac7..920f1f162 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -191,12 +191,6 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, private var startingUp = true - public var dirty = false { - didSet { - queueSaveToDiskIfNeeded() - } - } - public var unreadCount = 0 { didSet { if unreadCount != oldValue { @@ -221,7 +215,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, } else { NotificationCenter.default.post(name: .AccountRefreshDidFinish, object: self) - queueSaveToDiskIfNeeded() + opmlFile.queueSaveToDiskIfNeeded() } } } @@ -625,7 +619,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, // Feeds were added or deleted. Or folders added or deleted. // Or feeds inside folders were added or deleted. if !startingUp { - dirty = true + opmlFile.markAsDirty() } flattenedFeedsNeedUpdate = true feedDictionaryNeedsUpdate = true @@ -768,13 +762,6 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, } } - @objc func saveToDiskIfNeeded() { - if dirty && !isDeleted { - dirty = false - opmlFile.save() - } - } - @objc func saveFeedMetadataIfNeeded() { if feedMetadataDirty && !isDeleted { saveFeedMetadata() @@ -958,10 +945,6 @@ private extension Account { private extension Account { - func queueSaveToDiskIfNeeded() { - Account.saveQueue.add(self, #selector(saveToDiskIfNeeded)) - } - func pullObjectsFromDisk() { loadAccountMetadata() loadFeedMetadata() diff --git a/Frameworks/Account/OPMLFile.swift b/Frameworks/Account/OPMLFile.swift index 39b67b3a0..fbf3fa32a 100644 --- a/Frameworks/Account/OPMLFile.swift +++ b/Frameworks/Account/OPMLFile.swift @@ -15,6 +15,13 @@ final class OPMLFile: NSObject, NSFilePresenter { private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "account") + private var isDirty = false { + didSet { + queueSaveToDiskIfNeeded() + } + } + + private var isLoading = false private let filename: String private let account: Account private let operationQueue: OperationQueue @@ -44,13 +51,36 @@ final class OPMLFile: NSObject, NSFilePresenter { } } + func markAsDirty() { + if !isLoading { + isDirty = true + } + } + + func queueSaveToDiskIfNeeded() { + Account.saveQueue.add(self, #selector(saveToDiskIfNeeded)) + } + func load() { + isLoading = true guard let opmlItems = parsedOPMLItems() else { return } BatchUpdate.shared.perform { account.loadOPMLItems(opmlItems, parentFolder: nil) } + isLoading = false } +} + +private extension OPMLFile { + + @objc func saveToDiskIfNeeded() { + if isDirty && !account.isDeleted { + isDirty = false + save() + } + } + func save() { let opmlDocumentString = opmlDocument() do { @@ -61,16 +91,14 @@ final class OPMLFile: NSObject, NSFilePresenter { } } -} - -private extension OPMLFile { - func reload() { + isLoading = true guard let opmlItems = parsedOPMLItems() else { return } BatchUpdate.shared.perform { account.topLevelFeeds.removeAll() account.loadOPMLItems(opmlItems, parentFolder: nil) } + isLoading = false } func parsedOPMLItems() -> [RSOPMLItem]? {