diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index f17eb02ea..1a367e2b0 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -209,9 +209,13 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, // MARK: - API - public func refreshAll() { + public func restore() { + delegate.restore() + } + + public func refreshAll(refreshMode: AccountRefreshMode) { - delegate.refreshAll(for: self) + delegate.refreshAll(for: self, refreshMode: refreshMode) } public func update(_ feed: Feed, with parsedFeed: ParsedFeed, _ completion: @escaping RSVoidCompletionBlock) { @@ -356,7 +360,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, structureDidChange() DispatchQueue.main.async { - self.refreshAll() + self.refreshAll(refreshMode: .forground) } } diff --git a/Frameworks/Account/Account.xcodeproj/project.pbxproj b/Frameworks/Account/Account.xcodeproj/project.pbxproj index 8bc75caa8..775db5a3c 100644 --- a/Frameworks/Account/Account.xcodeproj/project.pbxproj +++ b/Frameworks/Account/Account.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 519881F52271EF43008D4FA8 /* AccountRefreshMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 519881F42271EF43008D4FA8 /* AccountRefreshMode.swift */; }; 841973FE1F6DD1BC006346C4 /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841973EF1F6DD19E006346C4 /* RSCore.framework */; }; 841973FF1F6DD1C5006346C4 /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841973FA1F6DD1AC006346C4 /* RSParser.framework */; }; 841974011F6DD1EC006346C4 /* Folder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841974001F6DD1EC006346C4 /* Folder.swift */; }; @@ -83,6 +84,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 519881F42271EF43008D4FA8 /* AccountRefreshMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountRefreshMode.swift; sourceTree = ""; }; 841973E81F6DD19E006346C4 /* RSCore.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSCore.xcodeproj; path = ../RSCore/RSCore.xcodeproj; sourceTree = ""; }; 841973F41F6DD1AC006346C4 /* RSParser.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSParser.xcodeproj; path = ../RSParser/RSParser.xcodeproj; sourceTree = ""; }; 841974001F6DD1EC006346C4 /* Folder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Folder.swift; sourceTree = ""; }; @@ -203,6 +205,7 @@ isa = PBXGroup; children = ( 846E77531F6F00E300A165E2 /* AccountManager.swift */, + 519881F42271EF43008D4FA8 /* AccountRefreshMode.swift */, 848935101F62486800CEBD24 /* Account.swift */, 84AF4EA3222CFDD100F6A800 /* AccountSettings.swift */, 841974241F6DDCE4006346C4 /* AccountDelegate.swift */, @@ -427,6 +430,7 @@ 84B99C9F1FAE8D3200ECDEDB /* ContainerPath.swift in Sources */, 846E77501F6EF9C400A165E2 /* LocalAccountRefresher.swift in Sources */, 84D09623217418DC00D77525 /* FeedbinTagging.swift in Sources */, + 519881F52271EF43008D4FA8 /* AccountRefreshMode.swift in Sources */, 84CAD7161FDF2E22000F0755 /* FeedbinArticle.swift in Sources */, 84D0962521741B8500D77525 /* FeedbinSavedSearch.swift in Sources */, 841974011F6DD1EC006346C4 /* Folder.swift in Sources */, diff --git a/Frameworks/Account/AccountDelegate.swift b/Frameworks/Account/AccountDelegate.swift index 5da492f37..5868f321d 100644 --- a/Frameworks/Account/AccountDelegate.swift +++ b/Frameworks/Account/AccountDelegate.swift @@ -16,7 +16,9 @@ public protocol AccountDelegate { var refreshProgress: DownloadProgress { get } - func refreshAll(for: Account) + func restore() + + func refreshAll(for: Account, refreshMode: AccountRefreshMode) // Called at the end of account’s init method. diff --git a/Frameworks/Account/AccountManager.swift b/Frameworks/Account/AccountManager.swift index 3af54eca8..6bc04381e 100644 --- a/Frameworks/Account/AccountManager.swift +++ b/Frameworks/Account/AccountManager.swift @@ -84,9 +84,13 @@ public final class AccountManager: UnreadCountProvider { return accountsDictionary[accountID] } - public func refreshAll() { + public func restore() { + accounts.forEach { $0.restore() } + } + + public func refreshAll(refreshMode: AccountRefreshMode = .forground) { - accounts.forEach { $0.refreshAll() } + accounts.forEach { $0.refreshAll(refreshMode: refreshMode) } } public func anyAccountHasAtLeastOneFeed() -> Bool { diff --git a/Frameworks/Account/AccountRefreshMode.swift b/Frameworks/Account/AccountRefreshMode.swift new file mode 100644 index 000000000..8c2a8891b --- /dev/null +++ b/Frameworks/Account/AccountRefreshMode.swift @@ -0,0 +1,14 @@ +// +// AccountRefreshMode.swift +// Account +// +// Created by Maurice Parker on 4/25/19. +// Copyright © 2019 Ranchero Software, LLC. All rights reserved. +// + +import Foundation + +public enum AccountRefreshMode { + case background + case forground +} diff --git a/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift b/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift index 259d437a5..4e60c4477 100644 --- a/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift +++ b/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift @@ -18,9 +18,13 @@ final class LocalAccountDelegate: AccountDelegate { return refresher.progress } - func refreshAll(for account: Account) { + func restore() { + refresher.restore() + } + + func refreshAll(for account: Account, refreshMode: AccountRefreshMode) { - refresher.refreshFeeds(account.flattenedFeeds()) + refresher.refreshFeeds(account.flattenedFeeds(), refreshMode: refreshMode) } func accountDidInitialize(_ account: Account) { diff --git a/Frameworks/Account/LocalAccount/LocalAccountRefresher.swift b/Frameworks/Account/LocalAccount/LocalAccountRefresher.swift index 45f33aae5..4443df59d 100644 --- a/Frameworks/Account/LocalAccount/LocalAccountRefresher.swift +++ b/Frameworks/Account/LocalAccount/LocalAccountRefresher.swift @@ -14,18 +14,29 @@ import Articles final class LocalAccountRefresher { - private lazy var downloadSession: DownloadSession = { - return DefaultDownloadSession(delegate: self) + var progress = DownloadProgress(numberOfTasks: 0) + + private lazy var backgroundDownloadSession: DownloadSession = { + return BackgroundDownloadSession(delegate: self, progress: DownloadProgress(numberOfTasks: 0)) + }() + + private lazy var defaultDownloadSession: DownloadSession = { + return DefaultDownloadSession(delegate: self, progress: progress) }() - var progress: DownloadProgress { - return downloadSession.progress + public func restore() { + _ = backgroundDownloadSession + _ = defaultDownloadSession } - - public func refreshFeeds(_ feeds: Set) { - - downloadSession.downloadObjects(feeds as NSSet) + + public func refreshFeeds(_ feeds: Set, refreshMode: AccountRefreshMode) { + if refreshMode == .forground { + defaultDownloadSession.downloadObjects(feeds as NSSet) + } else { + backgroundDownloadSession.downloadObjects(feeds as NSSet) + } } + } // MARK: - DownloadSessionDelegate diff --git a/iOS/AppDelegate.swift b/iOS/AppDelegate.swift index 8194187bc..87bab45f5 100644 --- a/iOS/AppDelegate.swift +++ b/iOS/AppDelegate.swift @@ -45,9 +45,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange(_:)), name: UserDefaults.didChangeNotification, object: nil) - // Initialize the AccountManager as soon as possible or it will cause problems - // if the application is restoring preserved state. - _ = AccountManager.shared + AccountManager.shared.restore() } @@ -185,7 +183,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { logDebugMessage("Woken to fetch articles.") - AccountManager.shared.refreshAll() + AccountManager.shared.refreshAll(refreshMode: .background) completionHandler(.newData) } diff --git a/submodules/RSWeb b/submodules/RSWeb index a1b94ee85..8b517a8b5 160000 --- a/submodules/RSWeb +++ b/submodules/RSWeb @@ -1 +1 @@ -Subproject commit a1b94ee858506af6a70b5b7fdfd9f6227b9eae45 +Subproject commit 8b517a8b53bdbbbf2c3bf2b809ca51d586fcf6ad