diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 372fe92f2..19c324ea4 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -166,14 +166,14 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, delegate.refreshAll(for: self) } - func metadata(for feed: Feed) -> FeedMetadata { - if let d = feedMetadata[feed.feedID] { + func metadata(feedID: String) -> FeedMetadata { + if let d = feedMetadata[feedID] { assert(d.delegate === self) return d } - let d = FeedMetadata(feedID: feed.feedID) + let d = FeedMetadata(feedID: feedID) d.delegate = self - feedMetadata[feed.feedID] = d + feedMetadata[feedID] = d return d } @@ -278,8 +278,9 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, // For syncing, this may need to be an async method with a callback, // since it will likely need to call the server. - - let feed = Feed(account: self, url: url, feedID: url) + + let feedMetadata = metadata(feedID: url) + let feed = Feed(account: self, url: url, feedID: url, metadata: feedMetadata) if let name = name, feed.name == nil { feed.name = name } @@ -732,8 +733,9 @@ private extension Account { } func createFeed(with opmlFeedSpecifier: RSOPMLFeedSpecifier) -> Feed { - - let feed = Feed(account: self, url: opmlFeedSpecifier.feedURL, feedID: opmlFeedSpecifier.feedURL) + let feedID = opmlFeedSpecifier.feedURL + let feedMetadata = metadata(feedID: feedID) + let feed = Feed(account: self, url: opmlFeedSpecifier.feedURL, feedID: feedID, metadata: feedMetadata) if let feedTitle = opmlFeedSpecifier.title { if feed.name == nil { feed.name = feedTitle diff --git a/Frameworks/Account/Feed.swift b/Frameworks/Account/Feed.swift index 34e78307d..7fb0a8e93 100644 --- a/Frameworks/Account/Feed.swift +++ b/Frameworks/Account/Feed.swift @@ -19,43 +19,43 @@ public final class Feed: DisplayNameProvider, Renamable, UnreadCountProvider, Ha public var homePageURL: String? { get { - return metadata?.homePageURL + return metadata.homePageURL } set { if let url = newValue { - metadata?.homePageURL = url.rs_normalizedURL() + metadata.homePageURL = url.rs_normalizedURL() } else { - metadata?.homePageURL = nil + metadata.homePageURL = nil } } } public var iconURL: String? { get { - return metadata?.iconURL + return metadata.iconURL } set { - metadata?.iconURL = newValue + metadata.iconURL = newValue } } public var faviconURL: String? { get { - return metadata?.faviconURL + return metadata.faviconURL } set { - metadata?.faviconURL = newValue + metadata.faviconURL = newValue } } public var name: String? { get { - return metadata?.name + return metadata.name } set { let oldNameForDisplay = nameForDisplay - metadata?.name = newValue + metadata.name = newValue if oldNameForDisplay != nameForDisplay { postDisplayNameDidChangeNotification() } @@ -64,17 +64,17 @@ public final class Feed: DisplayNameProvider, Renamable, UnreadCountProvider, Ha public var authors: Set? { get { - if let authorsArray = metadata?.authors { + if let authorsArray = metadata.authors { return Set(authorsArray) } return nil } set { if let authorsSet = newValue { - metadata?.authors = Array(authorsSet) + metadata.authors = Array(authorsSet) } else { - metadata?.authors = nil + metadata.authors = nil } } } @@ -82,7 +82,7 @@ public final class Feed: DisplayNameProvider, Renamable, UnreadCountProvider, Ha public var editedName: String? { // Don’t let editedName == "" get { - guard let s = metadata?.editedName, !s.isEmpty else { + guard let s = metadata.editedName, !s.isEmpty else { return nil } return s @@ -90,10 +90,10 @@ public final class Feed: DisplayNameProvider, Renamable, UnreadCountProvider, Ha set { if newValue != editedName { if let valueToSet = newValue, !valueToSet.isEmpty { - metadata?.editedName = valueToSet + metadata.editedName = valueToSet } else { - metadata?.editedName = nil + metadata.editedName = nil } postDisplayNameDidChangeNotification() } @@ -102,19 +102,19 @@ public final class Feed: DisplayNameProvider, Renamable, UnreadCountProvider, Ha public var conditionalGetInfo: HTTPConditionalGetInfo? { get { - return metadata?.conditionalGetInfo + return metadata.conditionalGetInfo } set { - metadata?.conditionalGetInfo = newValue + metadata.conditionalGetInfo = newValue } } public var contentHash: String? { get { - return metadata?.contentHash + return metadata.contentHash } set { - metadata?.contentHash = newValue + metadata.contentHash = newValue } } @@ -152,23 +152,16 @@ public final class Feed: DisplayNameProvider, Renamable, UnreadCountProvider, Ha } private let accountID: String // Used for hashing and equality; account may turn nil - - private var _metadata: FeedMetadata? - private var metadata: FeedMetadata? { - if let cachedMetadata = _metadata { - return cachedMetadata - } - _metadata = account?.metadata(for: self) - return _metadata - } + private let metadata: FeedMetadata // MARK: - Init - public init(account: Account, url: String, feedID: String) { + public init(account: Account, url: String, feedID: String, metadata: FeedMetadata) { self.account = account self.accountID = account.accountID self.url = url self.feedID = feedID + self.metadata = metadata } // MARK: - Debug diff --git a/Frameworks/Account/FeedMetadata.swift b/Frameworks/Account/FeedMetadata.swift index 23116ebbd..2d359256c 100644 --- a/Frameworks/Account/FeedMetadata.swift +++ b/Frameworks/Account/FeedMetadata.swift @@ -14,7 +14,7 @@ protocol FeedMetadataDelegate: class { func valueDidChange(_ feedMetadata: FeedMetadata, key: FeedMetadata.CodingKeys) } -final class FeedMetadata: Codable { +public final class FeedMetadata: Codable { let feedID: String