From e68383da09f2582626443e9c9390388d18ce02dd Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 26 Apr 2020 09:37:36 -0500 Subject: [PATCH] Don't send full article for updated articles if already read --- .../CloudKit/CloudKitAccountDelegate.swift | 2 +- .../CloudKit/CloudKitArticlesZone.swift | 73 ++++++++++--------- 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift index e537351c3..296307f2a 100644 --- a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift @@ -117,7 +117,7 @@ final class CloudKitAccountDelegate: AccountDelegate { func processWithArticles(_ articles: Set
) { - self.articlesZone.modifyArticles(syncStatuses, articles: articles) { result in + self.articlesZone.modifyArticles(articles) { result in switch result { case .success: self.database.deleteSelectedForProcessing(syncStatuses.map({ $0.articleID }) ) diff --git a/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift b/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift index c8b085cf4..001cefa88 100644 --- a/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift +++ b/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift @@ -12,7 +12,6 @@ import RSParser import RSWeb import CloudKit import Articles -import SyncDatabase final class CloudKitArticlesZone: CloudKitZone { @@ -80,10 +79,7 @@ final class CloudKitArticlesZone: CloudKitZone { return } - var records = [CKRecord]() - for article in articles { - records.append(contentsOf: makeArticleRecords(article)) - } + let records = makeRecords(articles) saveIfNew(records, completion: completion) } @@ -113,7 +109,44 @@ final class CloudKitArticlesZone: CloudKitZone { delete(recordIDs: recordIDs, completion: completion) } - func modifyArticles(_ syncStatuses: [SyncStatus], articles: Set
, completion: @escaping ((Result) -> Void)) { + func modifyArticles(_ articles: Set
, completion: @escaping ((Result) -> Void)) { + guard !articles.isEmpty else { + completion(.success(())) + return + } + + let records = makeRecords(articles) + + self.modify(recordsToSave: records, recordIDsToDelete: []) { result in + switch result { + case .success: + completion(.success(())) + case .failure(let error): + self.handleSendArticleStatusError(error, articles: articles, completion: completion) + } + } + } + +} + +private extension CloudKitArticlesZone { + + func handleSendArticleStatusError(_ error: Error, articles: Set
, completion: @escaping ((Result) -> Void)) { + if case CloudKitZoneError.userDeletedZone = error { + self.createZoneRecord() { result in + switch result { + case .success: + self.modifyArticles(articles, completion: completion) + case .failure(let error): + completion(.failure(error)) + } + } + } else { + completion(.failure(error)) + } + } + + func makeRecords(_ articles: Set
) -> [CKRecord] { var records = [CKRecord]() let saveArticles = articles.filter { $0.status.read == false || $0.status.starred == true } @@ -126,33 +159,7 @@ final class CloudKitArticlesZone: CloudKitZone { records.append(contentsOf: makeHollowArticleRecords(hollowArticle)) } - self.modify(recordsToSave: records, recordIDsToDelete: []) { result in - switch result { - case .success: - completion(.success(())) - case .failure(let error): - self.handleSendArticleStatusError(error, syncStatuses: syncStatuses, starredArticles: articles, completion: completion) - } - } - } - -} - -private extension CloudKitArticlesZone { - - func handleSendArticleStatusError(_ error: Error, syncStatuses: [SyncStatus], starredArticles: Set
, completion: @escaping ((Result) -> Void)) { - if case CloudKitZoneError.userDeletedZone = error { - self.createZoneRecord() { result in - switch result { - case .success: - self.modifyArticles(syncStatuses, articles: starredArticles, completion: completion) - case .failure(let error): - completion(.failure(error)) - } - } - } else { - completion(.failure(error)) - } + return records } func makeArticleRecords(_ article: Article) -> [CKRecord] {