mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2025-02-09 16:48:45 +01:00
Make progress reading/writing Account feeds and folders to disk.
This commit is contained in:
parent
55967f8731
commit
48543bcfd6
@ -33,7 +33,7 @@ public final class Account: DisplayNameProvider, Hashable {
|
|||||||
let settingsFile: String
|
let settingsFile: String
|
||||||
let dataFolder: String
|
let dataFolder: String
|
||||||
let database: Database
|
let database: Database
|
||||||
var topLevelObjects = [AnyObject]()
|
var topLevelObjects = [Any]()
|
||||||
var feedIDDictionary = [String: Feed]()
|
var feedIDDictionary = [String: Feed]()
|
||||||
var username: String?
|
var username: String?
|
||||||
var refreshInProgress = false
|
var refreshInProgress = false
|
||||||
@ -56,6 +56,8 @@ public final class Account: DisplayNameProvider, Hashable {
|
|||||||
|
|
||||||
let databaseFilePath = (dataFolder as NSString).appendingPathComponent("DB.sqlite3")
|
let databaseFilePath = (dataFolder as NSString).appendingPathComponent("DB.sqlite3")
|
||||||
self.database = Database(databaseFilePath: databaseFilePath, accountID: accountID)
|
self.database = Database(databaseFilePath: databaseFilePath, accountID: accountID)
|
||||||
|
|
||||||
|
pullObjectsFromDisk()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - API
|
// MARK: - API
|
||||||
@ -122,13 +124,68 @@ public final class Account: DisplayNameProvider, Hashable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extension Account: PlistProvider {
|
// MARK: - Disk
|
||||||
|
|
||||||
|
extension Account {
|
||||||
|
|
||||||
public func plist() -> AnyObject? {
|
public func plist() -> AnyObject? {
|
||||||
return nil // TODO
|
return nil // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private struct Key {
|
||||||
|
static let children = "children"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pullObjectsFromDisk() {
|
||||||
|
|
||||||
|
guard let d = NSDictionary(contentsOf: settingsFile) as? [String: Any] else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guard let childrenArray = d[Key.children] as? [Any] else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
topLevelObjects = objects(with: childrenArray)
|
||||||
|
updateFeedIDDictionary()
|
||||||
|
}
|
||||||
|
|
||||||
|
func objects(with diskObjects: [[String: Any]]) -> [Any] {
|
||||||
|
|
||||||
|
return diskObjects.flatMap { object(with: $0) }
|
||||||
|
}
|
||||||
|
|
||||||
|
func object(with diskObject: Any) -> Any {
|
||||||
|
|
||||||
|
guard let d = diskObject as? [String: Any] else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if diskObjectIsFeed(diskObject) {
|
||||||
|
return Feed(accountID: accountID, dictionary: diskObject)
|
||||||
|
}
|
||||||
|
return Folder(accountID: accountID, dictionary: diskObject)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func diskObjectIsFeed(_ diskObject: [String: Any]) -> Bool {
|
||||||
|
|
||||||
|
return d[Feed.Key.url] != nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark: - FeedIDDictionary
|
||||||
|
|
||||||
|
private extension Account {
|
||||||
|
|
||||||
|
func updateFeedIDDictionary() {
|
||||||
|
|
||||||
|
var d = [String: Feed]()
|
||||||
|
for feed in flattenedFeeds() {
|
||||||
|
d[feed.feedID] = feed
|
||||||
|
}
|
||||||
|
feedIDDictionary = d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - OPMLRepresentable
|
||||||
|
|
||||||
extension Account: OPMLRepresentable {
|
extension Account: OPMLRepresentable {
|
||||||
|
|
||||||
public func OPMLString(indentLevel: Int) -> String {
|
public func OPMLString(indentLevel: Int) -> String {
|
||||||
|
@ -12,7 +12,8 @@ import Data
|
|||||||
public final class Folder: DisplayNameProvider, UnreadCountProvider {
|
public final class Folder: DisplayNameProvider, UnreadCountProvider {
|
||||||
|
|
||||||
public let accountID: String
|
public let accountID: String
|
||||||
var childObjects = [AnyObject]()
|
var children = [Any]()
|
||||||
|
var name: String?
|
||||||
|
|
||||||
public var account: Account? {
|
public var account: Account? {
|
||||||
get {
|
get {
|
||||||
@ -22,7 +23,12 @@ public final class Folder: DisplayNameProvider, UnreadCountProvider {
|
|||||||
|
|
||||||
// MARK: - DisplayNameProvider
|
// MARK: - DisplayNameProvider
|
||||||
|
|
||||||
public var nameForDisplay: String
|
public var nameForDisplay: String {
|
||||||
|
get {
|
||||||
|
return name ?? NSLocalizedString("Untitled ƒ", comment: "Folder name")
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - UnreadCountProvider
|
// MARK: - UnreadCountProvider
|
||||||
|
|
||||||
@ -41,6 +47,53 @@ public final class Folder: DisplayNameProvider, UnreadCountProvider {
|
|||||||
self.accountID = accountID
|
self.accountID = accountID
|
||||||
self.nameForDisplay = nameForDisplay
|
self.nameForDisplay = nameForDisplay
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Disk Dictionary
|
||||||
|
|
||||||
|
struct Key {
|
||||||
|
static let name = "name"
|
||||||
|
static let unreadCount = "unreadCount"
|
||||||
|
static let childrenKey = "children"
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience public init?(account: Account, dictionary: [String: Any]) {
|
||||||
|
|
||||||
|
self.name = dictionary[Key.name]
|
||||||
|
|
||||||
|
if let childrenArray = dictionary[Key.childrenKey] {
|
||||||
|
self.childObjects = account.objects(with: childrenArray)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let savedUnreadCount = dictionary[Key.unreadCount] as? Int {
|
||||||
|
self.unreadCount = savedUnreadCount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public var dictionary: [String: Any] {
|
||||||
|
get {
|
||||||
|
var d = [String: Any]()
|
||||||
|
|
||||||
|
if let name = name {
|
||||||
|
d[Key.name] = name
|
||||||
|
}
|
||||||
|
if unreadCount > 0 {
|
||||||
|
d[Key.unreadCount] = unreadCount
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: children as dictionaries - use method in Account
|
||||||
|
|
||||||
|
|
||||||
|
let childObjects = children.flatMap { (child) -> [String: Any]? in
|
||||||
|
|
||||||
|
if let feed = child as? Feed {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Folder: OPMLRepresentable {
|
extension Folder: OPMLRepresentable {
|
||||||
|
@ -52,7 +52,7 @@ public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
|||||||
|
|
||||||
// MARK: - Disk Dictionary
|
// MARK: - Disk Dictionary
|
||||||
|
|
||||||
private struct Key {
|
struct Key {
|
||||||
static let url = "url"
|
static let url = "url"
|
||||||
static let feedID = "feedID"
|
static let feedID = "feedID"
|
||||||
static let homePageURL = "homePageURL"
|
static let homePageURL = "homePageURL"
|
||||||
@ -106,7 +106,7 @@ public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
|||||||
d[Key.unreadCount] = unreadCount
|
d[Key.unreadCount] = unreadCount
|
||||||
}
|
}
|
||||||
if let conditionalGetInfo = conditionalGetInfo {
|
if let conditionalGetInfo = conditionalGetInfo {
|
||||||
d[Key.conditionalGetInfo] = conditionalGetInfo.dictionary
|
d[Key.conditionalGetInfo] = conditionalGetInfo.dOictionary
|
||||||
}
|
}
|
||||||
|
|
||||||
return d
|
return d
|
||||||
|
Loading…
x
Reference in New Issue
Block a user