diff --git a/Frameworks/Database/ArticlesTable.swift b/Frameworks/Database/ArticlesTable.swift index 00ea7ab42..dfe3542ed 100644 --- a/Frameworks/Database/ArticlesTable.swift +++ b/Frameworks/Database/ArticlesTable.swift @@ -20,9 +20,8 @@ final class ArticlesTable: DatabaseTable { private let authorsLookupTable: DatabaseLookupTable private let attachmentsLookupTable: DatabaseLookupTable private let tagsLookupTable: DatabaseLookupTable - -// private let cachedArticles: NSMapTable = NSMapTable.weakToWeakObjects() - + private let articleCache = ArticleCache() + init(name: String) { self.name = name @@ -157,3 +156,40 @@ final class ArticlesTable: DatabaseTable { // } //} +private struct ArticleCache { + + // Main thread only. + // The cache contains a given article only until all outside references are gone. + // Cache key is articleID. + + private let articlesMapTable: NSMapTable = NSMapTable.weakToWeakObjects() + + func uniquedArticles(_ articles: Set
) -> Set
{ + + var articlesToReturn = Set
() + + for article in articles { + let articleID = article.articleID + if let cachedArticle = cachedArticle(for: articleID) { + articlesToReturn.insert(cachedArticle) + } + else { + articlesToReturn.insert(article) + addToCache(article) + } + } + + return articlesToReturn + } + + private func cachedArticle(for articleID: String) -> Article? { + + return articlesMapTable.object(forKey: articleID as NSString) + } + + private func addToCache(_ article: Article) { + + articlesMapTable.setObject(article, forKey: article.articleID as NSString) + } +} +