mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2024-12-26 09:33:25 +01:00
Create PseudoFeed.swift. This will be used for Today, All Unread, Starred, etc.
This commit is contained in:
parent
911e992b76
commit
93b8da15dc
@ -13,6 +13,7 @@
|
|||||||
842E45E51ED8C6B7000A8B52 /* MainWindowSplitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842E45E41ED8C6B7000A8B52 /* MainWindowSplitView.swift */; };
|
842E45E51ED8C6B7000A8B52 /* MainWindowSplitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842E45E41ED8C6B7000A8B52 /* MainWindowSplitView.swift */; };
|
||||||
842E45E71ED8C747000A8B52 /* DB5.plist in Resources */ = {isa = PBXBuildFile; fileRef = 842E45E61ED8C747000A8B52 /* DB5.plist */; };
|
842E45E71ED8C747000A8B52 /* DB5.plist in Resources */ = {isa = PBXBuildFile; fileRef = 842E45E61ED8C747000A8B52 /* DB5.plist */; };
|
||||||
84513F901FAA63950023A1A9 /* FeedListControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */; };
|
84513F901FAA63950023A1A9 /* FeedListControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */; };
|
||||||
|
845B14921FC2028A0013CF92 /* PseudoFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845B14911FC2028A0013CF92 /* PseudoFeed.swift */; };
|
||||||
845F52ED1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */; };
|
845F52ED1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */; };
|
||||||
846E773D1F6EF67A00A165E2 /* Account.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846E773A1F6EF5D700A165E2 /* Account.framework */; };
|
846E773D1F6EF67A00A165E2 /* Account.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846E773A1F6EF5D700A165E2 /* Account.framework */; };
|
||||||
846E773E1F6EF67A00A165E2 /* Account.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 846E773A1F6EF5D700A165E2 /* Account.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
846E773E1F6EF67A00A165E2 /* Account.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 846E773A1F6EF5D700A165E2 /* Account.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
@ -396,6 +397,7 @@
|
|||||||
842E45E41ED8C6B7000A8B52 /* MainWindowSplitView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainWindowSplitView.swift; sourceTree = "<group>"; };
|
842E45E41ED8C6B7000A8B52 /* MainWindowSplitView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainWindowSplitView.swift; sourceTree = "<group>"; };
|
||||||
842E45E61ED8C747000A8B52 /* DB5.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = DB5.plist; path = Evergreen/Resources/DB5.plist; sourceTree = "<group>"; };
|
842E45E61ED8C747000A8B52 /* DB5.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = DB5.plist; path = Evergreen/Resources/DB5.plist; sourceTree = "<group>"; };
|
||||||
84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListControlsView.swift; sourceTree = "<group>"; };
|
84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListControlsView.swift; sourceTree = "<group>"; };
|
||||||
|
845B14911FC2028A0013CF92 /* PseudoFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PseudoFeed.swift; sourceTree = "<group>"; };
|
||||||
845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedPasteboardWriter.swift; sourceTree = "<group>"; };
|
845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedPasteboardWriter.swift; sourceTree = "<group>"; };
|
||||||
846E77161F6EF5D000A165E2 /* Database.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Database.xcodeproj; path = Frameworks/Database/Database.xcodeproj; sourceTree = "<group>"; };
|
846E77161F6EF5D000A165E2 /* Database.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Database.xcodeproj; path = Frameworks/Database/Database.xcodeproj; sourceTree = "<group>"; };
|
||||||
846E77301F6EF5D600A165E2 /* Account.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Account.xcodeproj; path = Frameworks/Account/Account.xcodeproj; sourceTree = "<group>"; };
|
846E77301F6EF5D600A165E2 /* Account.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Account.xcodeproj; path = Frameworks/Account/Account.xcodeproj; sourceTree = "<group>"; };
|
||||||
@ -587,6 +589,7 @@
|
|||||||
849A97561ED9EB0D007D329B /* Data */ = {
|
849A97561ED9EB0D007D329B /* Data */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
845B14911FC2028A0013CF92 /* PseudoFeed.swift */,
|
||||||
849A97581ED9EB0D007D329B /* ArticleUtilities.swift */,
|
849A97581ED9EB0D007D329B /* ArticleUtilities.swift */,
|
||||||
);
|
);
|
||||||
name = Data;
|
name = Data;
|
||||||
@ -1297,6 +1300,7 @@
|
|||||||
84B99C691FAE36B800ECDEDB /* FeedListFolder.swift in Sources */,
|
84B99C691FAE36B800ECDEDB /* FeedListFolder.swift in Sources */,
|
||||||
84F204DE1FAACB8B0076E152 /* FeedListTimelineViewController.swift in Sources */,
|
84F204DE1FAACB8B0076E152 /* FeedListTimelineViewController.swift in Sources */,
|
||||||
849A97A31ED9F180007D329B /* FolderTreeControllerDelegate.swift in Sources */,
|
849A97A31ED9F180007D329B /* FolderTreeControllerDelegate.swift in Sources */,
|
||||||
|
845B14921FC2028A0013CF92 /* PseudoFeed.swift in Sources */,
|
||||||
849A97851ED9ECCD007D329B /* PreferencesWindowController.swift in Sources */,
|
849A97851ED9ECCD007D329B /* PreferencesWindowController.swift in Sources */,
|
||||||
849A977A1ED9EC04007D329B /* TimelineTableCellView.swift in Sources */,
|
849A977A1ED9EC04007D329B /* TimelineTableCellView.swift in Sources */,
|
||||||
849A97761ED9EC04007D329B /* TimelineCellAppearance.swift in Sources */,
|
849A97761ED9EC04007D329B /* TimelineCellAppearance.swift in Sources */,
|
||||||
|
92
Evergreen/Data/PseudoFeed.swift
Normal file
92
Evergreen/Data/PseudoFeed.swift
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
//
|
||||||
|
// PseudoFeed.swift
|
||||||
|
// Evergreen
|
||||||
|
//
|
||||||
|
// Created by Brent Simmons on 11/19/17.
|
||||||
|
// Copyright © 2017 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import Data
|
||||||
|
import RSCore
|
||||||
|
import Account
|
||||||
|
|
||||||
|
protocol PseudoFeedDelegate: DisplayNameProvider {
|
||||||
|
|
||||||
|
func fetchUnreadCount(for: Account, callback: (Int) -> Void)
|
||||||
|
}
|
||||||
|
|
||||||
|
final class PseudoFeed: UnreadCountProvider, DisplayNameProvider {
|
||||||
|
|
||||||
|
private static let fetchCoalescingDelay: TimeInterval = 0.1
|
||||||
|
private var timer: Timer?
|
||||||
|
private var unreadCounts = [Account: Int]()
|
||||||
|
private let delegate: PseudoFeedDelegate
|
||||||
|
|
||||||
|
var nameForDisplay: String {
|
||||||
|
get {
|
||||||
|
return delegate.nameForDisplay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var unreadCount = 0 {
|
||||||
|
didSet {
|
||||||
|
if unreadCount != oldValue {
|
||||||
|
postUnreadCountDidChangeNotification()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init(delegate: PseudoFeedDelegate) {
|
||||||
|
|
||||||
|
self.delegate = delegate
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func unreadCountDidChange(_ note: Notification) {
|
||||||
|
|
||||||
|
if let object = note.object, object is Account {
|
||||||
|
startCoalescingTimer()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func fetchUnreadCount(for account: Account) {
|
||||||
|
|
||||||
|
delegate.fetchUnreadCount(for: account) { (accountUnreadCount) in
|
||||||
|
unreadCounts[account] = accountUnreadCount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func fetchUnreadCounts() {
|
||||||
|
|
||||||
|
AccountManager.shared.accounts.forEach { self.fetchUnreadCount(for: $0) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateUnreadCount() {
|
||||||
|
|
||||||
|
unreadCount = AccountManager.shared.accounts.reduce(0) { (result, account) -> Int in
|
||||||
|
if let oneUnreadCount = unreadCounts[account] {
|
||||||
|
return result + oneUnreadCount
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Timer
|
||||||
|
|
||||||
|
private func stopTimer() {
|
||||||
|
|
||||||
|
if let timer = timer {
|
||||||
|
timer.rs_invalidateIfValid()
|
||||||
|
}
|
||||||
|
timer = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private func startCoalescingTimer() {
|
||||||
|
|
||||||
|
stopTimer()
|
||||||
|
timer = Timer(timeInterval: PseudoFeed.fetchCoalescingDelay, repeats: false, block: { (_) in
|
||||||
|
self.fetchUnreadCounts()
|
||||||
|
self.stopTimer()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user