Make feed.metadata no longer an optional.

This commit is contained in:
Brent Simmons 2019-03-16 12:08:31 -07:00
parent 47935717c5
commit 3e52bb9c24
3 changed files with 33 additions and 38 deletions

View File

@ -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
}
@ -279,7 +279,8 @@ 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

View File

@ -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<Author>? {
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? {
// Dont 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

View File

@ -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