Stop storing unreadCount for Feed and Folder objects on disk, since they’re fast to fetch at startup. Also, give Feed an ODBRawValueTable for metadata storage.
This commit is contained in:
parent
ce3a90c518
commit
b5b42b8df6
|
@ -60,6 +60,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||||
|
|
||||||
private let settingsODB: ODB
|
private let settingsODB: ODB
|
||||||
private let settingsTable: ODBTable
|
private let settingsTable: ODBTable
|
||||||
|
private let feedsPath: ODBPath
|
||||||
|
private let feedsTable: ODBTable
|
||||||
|
|
||||||
private struct SettingsKey {
|
private struct SettingsKey {
|
||||||
static let unreadCount = "unreadCount"
|
static let unreadCount = "unreadCount"
|
||||||
|
@ -122,6 +124,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||||
self.settingsODB.vacuum()
|
self.settingsODB.vacuum()
|
||||||
let settingsPath = ODBPath.path(["settings"])
|
let settingsPath = ODBPath.path(["settings"])
|
||||||
self.settingsTable = settingsODB.ensureTable(settingsPath)!
|
self.settingsTable = settingsODB.ensureTable(settingsPath)!
|
||||||
|
self.feedsPath = ODBPath.path(["feeds"])
|
||||||
|
self.feedsTable = settingsODB.ensureTable(self.feedsPath)!
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(downloadProgressDidChange(_:)), name: .DownloadProgressDidChange, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(downloadProgressDidChange(_:)), name: .DownloadProgressDidChange, object: nil)
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
||||||
|
@ -134,7 +138,6 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||||
pullObjectsFromDisk()
|
pullObjectsFromDisk()
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.updateUnreadCount()
|
|
||||||
self.fetchAllUnreadCounts()
|
self.fetchAllUnreadCounts()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,27 +442,9 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||||
@objc func unreadCountDidChange(_ note: Notification) {
|
@objc func unreadCountDidChange(_ note: Notification) {
|
||||||
|
|
||||||
// Update the unread count if it’s a direct child.
|
// Update the unread count if it’s a direct child.
|
||||||
// If the object is owned by this account, then mark dirty —
|
|
||||||
// since unread counts are saved to disk along with other feed info.
|
|
||||||
|
|
||||||
if let object = note.object {
|
if let object = note.object, objectIsChild(object as AnyObject) {
|
||||||
|
updateUnreadCount()
|
||||||
if objectIsChild(object as AnyObject) {
|
|
||||||
updateUnreadCount()
|
|
||||||
self.dirty = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if let feed = object as? Feed {
|
|
||||||
if feed.account === self {
|
|
||||||
self.dirty = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if let folder = object as? Folder {
|
|
||||||
if folder.account === self {
|
|
||||||
self.dirty = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,6 +514,12 @@ extension Account {
|
||||||
|
|
||||||
return diskObjects.compactMap { object(with: $0) }
|
return diskObjects.compactMap { object(with: $0) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func settingsTableForFeed(feedID: String) -> ODBRawValueTable? {
|
||||||
|
let feedPath = feedsPath + feedID
|
||||||
|
let table = settingsODB.ensureTable(feedPath)
|
||||||
|
return table?.rawValueTable
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Disk (Private)
|
// MARK: - Disk (Private)
|
||||||
|
@ -713,6 +704,7 @@ private extension Account {
|
||||||
feed.unreadCount = 0
|
feed.unreadCount = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.updateUnreadCount()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import Foundation
|
||||||
import RSCore
|
import RSCore
|
||||||
import RSWeb
|
import RSWeb
|
||||||
import Articles
|
import Articles
|
||||||
|
import RSDatabase
|
||||||
|
|
||||||
public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
||||||
|
|
||||||
|
@ -68,6 +69,10 @@ public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private lazy var settingsTable: ODBRawValueTable? = {
|
||||||
|
return account?.settingsTableForFeed(feedID: feedID)
|
||||||
|
}()
|
||||||
|
|
||||||
// MARK: - Init
|
// MARK: - Init
|
||||||
|
|
||||||
public init(accountID: String, url: String, feedID: String) {
|
public init(accountID: String, url: String, feedID: String) {
|
||||||
|
@ -90,7 +95,6 @@ public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
||||||
static let authors = "authors"
|
static let authors = "authors"
|
||||||
static let conditionalGetInfo = "conditionalGetInfo"
|
static let conditionalGetInfo = "conditionalGetInfo"
|
||||||
static let contentHash = "contentHash"
|
static let contentHash = "contentHash"
|
||||||
static let unreadCount = "unreadCount"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
convenience public init?(accountID: String, dictionary: [String: Any]) {
|
convenience public init?(accountID: String, dictionary: [String: Any]) {
|
||||||
|
@ -112,10 +116,6 @@ public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
||||||
self.conditionalGetInfo = HTTPConditionalGetInfo(dictionary: conditionalGetInfoDictionary)
|
self.conditionalGetInfo = HTTPConditionalGetInfo(dictionary: conditionalGetInfoDictionary)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let savedUnreadCount = dictionary[Key.unreadCount] as? Int {
|
|
||||||
self.unreadCount = savedUnreadCount
|
|
||||||
}
|
|
||||||
|
|
||||||
if let authorsDiskArray = dictionary[Key.authors] as? [[String: Any]] {
|
if let authorsDiskArray = dictionary[Key.authors] as? [[String: Any]] {
|
||||||
self.authors = Author.authorsWithDiskArray(authorsDiskArray)
|
self.authors = Author.authorsWithDiskArray(authorsDiskArray)
|
||||||
}
|
}
|
||||||
|
@ -157,9 +157,6 @@ public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
||||||
if let contentHash = contentHash {
|
if let contentHash = contentHash {
|
||||||
d[Key.contentHash] = contentHash
|
d[Key.contentHash] = contentHash
|
||||||
}
|
}
|
||||||
if unreadCount > 0 {
|
|
||||||
d[Key.unreadCount] = unreadCount
|
|
||||||
}
|
|
||||||
if let conditionalGetInfo = conditionalGetInfo {
|
if let conditionalGetInfo = conditionalGetInfo {
|
||||||
d[Key.conditionalGetInfo] = conditionalGetInfo.dictionary
|
d[Key.conditionalGetInfo] = conditionalGetInfo.dictionary
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,6 @@ public final class Folder: DisplayNameProvider, Container, UnreadCountProvider,
|
||||||
|
|
||||||
private struct Key {
|
private struct Key {
|
||||||
static let name = "name"
|
static let name = "name"
|
||||||
static let unreadCount = "unreadCount"
|
|
||||||
static let children = "children"
|
static let children = "children"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,10 +71,6 @@ public final class Folder: DisplayNameProvider, Container, UnreadCountProvider,
|
||||||
if let childrenArray = dictionary[Key.children] as? [[String: Any]] {
|
if let childrenArray = dictionary[Key.children] as? [[String: Any]] {
|
||||||
self.children = Folder.objects(with: childrenArray, account: account)
|
self.children = Folder.objects(with: childrenArray, account: account)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let savedUnreadCount = dictionary[Key.unreadCount] as? Int {
|
|
||||||
self.unreadCount = savedUnreadCount
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var dictionary: [String: Any] {
|
var dictionary: [String: Any] {
|
||||||
|
@ -88,10 +83,7 @@ public final class Folder: DisplayNameProvider, Container, UnreadCountProvider,
|
||||||
if let name = name {
|
if let name = name {
|
||||||
d[Key.name] = name
|
d[Key.name] = name
|
||||||
}
|
}
|
||||||
if unreadCount > 0 {
|
|
||||||
d[Key.unreadCount] = unreadCount
|
|
||||||
}
|
|
||||||
|
|
||||||
let childObjects = children.compactMap { (child) -> [String: Any]? in
|
let childObjects = children.compactMap { (child) -> [String: Any]? in
|
||||||
|
|
||||||
if let feed = child as? Feed {
|
if let feed = child as? Feed {
|
||||||
|
|
Loading…
Reference in New Issue