From 031617809f95efadfb9911616223a50869db873c Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 30 Jul 2017 11:36:27 -0700 Subject: [PATCH] Add uniquedObjects to ObjectCache. --- Frameworks/Database/StatusesTable.swift | 27 +++----------- .../RSDatabase/RSDatabase/ObjectCache.swift | 35 +++++++++++++++++-- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/Frameworks/Database/StatusesTable.swift b/Frameworks/Database/StatusesTable.swift index 680898fa2..7b5c7da3e 100644 --- a/Frameworks/Database/StatusesTable.swift +++ b/Frameworks/Database/StatusesTable.swift @@ -58,9 +58,9 @@ final class StatusesTable: DatabaseTable { let statuses = self.fetchStatusesForArticleIDs(articleIDs, database: database) DispatchQueue.main.async { - - self.cacheStatuses(statuses) - + + cache.addObjectsNotCached(Array(statuses)) + let newArticleIDs = self.articleIDsMissingStatuses(articleIDs) self.createStatusForNewArticleIDs(newArticleIDs) callback() @@ -155,7 +155,7 @@ private extension StatusesManager { let statuses = articleIDs.map { (oneArticleID) -> LocalArticleStatus in return ArticleStatus(articleID: oneArticleID, read: false, starred: false, userDeleted: false, dateArrived: now) } - cacheStatuses(Set(statuses)) + cache.addObjectsNotCached(statuses) queue.update { (database: FMDatabase!) -> Void in @@ -168,28 +168,11 @@ private extension StatusesManager { } } - // MARK: Cache - - func cacheStatus(_ status: ArticleStatus) { - - cacheStatuses(Set([status])) - } - - func cacheStatuses(_ statuses: Set) { - - statuses.forEach { (oneStatus) in - if let _ = cachedStatuses[oneStatus.articleID] { - return - } - cachedStatuses[oneStatus.articleID] = oneStatus - } - } - // MARK: Utilities func articleIDsMissingStatuses(_ articleIDs: Set) -> Set { - return Set(articleIDs.filter { cachedStatusForArticleID($0) == nil }) + return Set(articleIDs.filter { cache[$0] == nil }) } } diff --git a/Frameworks/RSDatabase/RSDatabase/ObjectCache.swift b/Frameworks/RSDatabase/RSDatabase/ObjectCache.swift index 27fce9091..c4fbd4bce 100644 --- a/Frameworks/RSDatabase/RSDatabase/ObjectCache.swift +++ b/Frameworks/RSDatabase/RSDatabase/ObjectCache.swift @@ -20,7 +20,12 @@ public final class ObjectCache { public func addObjects(_ objects: [T]) { - objects.forEach { addObject($0) } + objects.forEach { add($0) } + } + + public func addObjectsNotCached(_ objects: [T]) { + + objects.forEach { addIfNotCached($0) } } public func add(_ object: T) { @@ -29,6 +34,15 @@ public final class ObjectCache { self[identifier] = object } + public func addIfNotCached(_ object: T) { + + let identifier = identifierForObject(object) + if let _ = self[identifier] { + return + } + self[identifier] = object + } + public func removeObjects(_ objects: [T]) { objects.forEach { removeObject($0) } @@ -40,12 +54,29 @@ public final class ObjectCache { self[identifier] = nil } + public func uniquedObjects(_ objects: [T]) -> [T] { + + // Return cached version of each object. + // When an object is not already cached, cache it, + // then consider that version the unique version. + + return objects.map({ (object) -> T in + + let identifier = identifierForObject(object) + if let cachedObject = self[identifier] { + return cachedObject + } + add(object) + return object + }) + } + public subscript(_ identifier: String) -> T? { get { return dictionary[identifier] } set { - dictionary[identifier] = T + dictionary[identifier] = newValue } } }