Fetch unread article IDs async. Also: fetch only for feeds currently subscribed-to. Fix #1218.
This commit is contained in:
parent
2d69fdf98a
commit
a561ea9484
@ -673,8 +673,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
|||||||
database.fetchStarredAndUnreadCount(for: flattenedWebFeeds().webFeedIDs(), callback: callback)
|
database.fetchStarredAndUnreadCount(for: flattenedWebFeeds().webFeedIDs(), callback: callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func fetchUnreadArticleIDs() -> Set<String> {
|
public func fetchUnreadArticleIDs(_ callback: @escaping (Set<String>) -> Void) {
|
||||||
return database.fetchUnreadArticleIDs()
|
return database.fetchUnreadArticleIDsAsync(webFeedIDs: flattenedWebFeeds().webFeedIDs(), callback: callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func fetchStarredArticleIDs() -> Set<String> {
|
public func fetchStarredArticleIDs() -> Set<String> {
|
||||||
|
@ -500,46 +500,46 @@ private extension FeedWranglerAccountDelegate {
|
|||||||
|
|
||||||
func syncArticleReadState(_ account: Account, _ unreadFeedItems: [FeedWranglerFeedItem]) {
|
func syncArticleReadState(_ account: Account, _ unreadFeedItems: [FeedWranglerFeedItem]) {
|
||||||
let unreadServerItemIDs = Set(unreadFeedItems.map { String($0.feedItemID) })
|
let unreadServerItemIDs = Set(unreadFeedItems.map { String($0.feedItemID) })
|
||||||
let unreadLocalItemIDs = account.fetchUnreadArticleIDs()
|
account.fetchUnreadArticleIDs { unreadLocalItemIDs in
|
||||||
|
// unread if unread on server
|
||||||
|
let unreadDiffItemIDs = unreadServerItemIDs.subtracting(unreadLocalItemIDs)
|
||||||
|
let unreadFoundArticles = account.fetchArticles(.articleIDs(unreadDiffItemIDs))
|
||||||
|
account.update(unreadFoundArticles, statusKey: .read, flag: false)
|
||||||
|
|
||||||
// unread if unread on server
|
let unreadFoundItemIDs = Set(unreadFoundArticles.map { $0.articleID })
|
||||||
let unreadDiffItemIDs = unreadServerItemIDs.subtracting(unreadLocalItemIDs)
|
let missingArticleIDs = unreadDiffItemIDs.subtracting(unreadFoundItemIDs)
|
||||||
let unreadFoundArticles = account.fetchArticles(.articleIDs(unreadDiffItemIDs))
|
account.ensureStatuses(missingArticleIDs, true, .read, false)
|
||||||
account.update(unreadFoundArticles, statusKey: .read, flag: false)
|
|
||||||
|
|
||||||
let unreadFoundItemIDs = Set(unreadFoundArticles.map { $0.articleID })
|
let readItemIDs = unreadLocalItemIDs.subtracting(unreadServerItemIDs)
|
||||||
let missingArticleIDs = unreadDiffItemIDs.subtracting(unreadFoundItemIDs)
|
let readArtices = account.fetchArticles(.articleIDs(readItemIDs))
|
||||||
account.ensureStatuses(missingArticleIDs, true, .read, false)
|
account.update(readArtices, statusKey: .read, flag: true)
|
||||||
|
|
||||||
let readItemIDs = unreadLocalItemIDs.subtracting(unreadServerItemIDs)
|
let foundReadArticleIDs = Set(readArtices.map { $0.articleID })
|
||||||
let readArtices = account.fetchArticles(.articleIDs(readItemIDs))
|
let readMissingIDs = readItemIDs.subtracting(foundReadArticleIDs)
|
||||||
account.update(readArtices, statusKey: .read, flag: true)
|
account.ensureStatuses(readMissingIDs, true, .read, true)
|
||||||
|
}
|
||||||
let foundReadArticleIDs = Set(readArtices.map { $0.articleID })
|
|
||||||
let readMissingIDs = readItemIDs.subtracting(foundReadArticleIDs)
|
|
||||||
account.ensureStatuses(readMissingIDs, true, .read, true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncArticleStarredState(_ account: Account, _ unreadFeedItems: [FeedWranglerFeedItem]) {
|
func syncArticleStarredState(_ account: Account, _ unreadFeedItems: [FeedWranglerFeedItem]) {
|
||||||
let unreadServerItemIDs = Set(unreadFeedItems.map { String($0.feedItemID) })
|
let unreadServerItemIDs = Set(unreadFeedItems.map { String($0.feedItemID) })
|
||||||
let unreadLocalItemIDs = account.fetchUnreadArticleIDs()
|
account.fetchUnreadArticleIDs { unreadLocalItemIDs in
|
||||||
|
// starred if start on server
|
||||||
|
let unreadDiffItemIDs = unreadServerItemIDs.subtracting(unreadLocalItemIDs)
|
||||||
|
let unreadFoundArticles = account.fetchArticles(.articleIDs(unreadDiffItemIDs))
|
||||||
|
account.update(unreadFoundArticles, statusKey: .starred, flag: true)
|
||||||
|
|
||||||
// starred if start on server
|
let unreadFoundItemIDs = Set(unreadFoundArticles.map { $0.articleID })
|
||||||
let unreadDiffItemIDs = unreadServerItemIDs.subtracting(unreadLocalItemIDs)
|
let missingArticleIDs = unreadDiffItemIDs.subtracting(unreadFoundItemIDs)
|
||||||
let unreadFoundArticles = account.fetchArticles(.articleIDs(unreadDiffItemIDs))
|
account.ensureStatuses(missingArticleIDs, true, .starred, true)
|
||||||
account.update(unreadFoundArticles, statusKey: .starred, flag: true)
|
|
||||||
|
|
||||||
let unreadFoundItemIDs = Set(unreadFoundArticles.map { $0.articleID })
|
let readItemIDs = unreadLocalItemIDs.subtracting(unreadServerItemIDs)
|
||||||
let missingArticleIDs = unreadDiffItemIDs.subtracting(unreadFoundItemIDs)
|
let readArtices = account.fetchArticles(.articleIDs(readItemIDs))
|
||||||
account.ensureStatuses(missingArticleIDs, true, .starred, true)
|
account.update(readArtices, statusKey: .starred, flag: false)
|
||||||
|
|
||||||
let readItemIDs = unreadLocalItemIDs.subtracting(unreadServerItemIDs)
|
let foundReadArticleIDs = Set(readArtices.map { $0.articleID })
|
||||||
let readArtices = account.fetchArticles(.articleIDs(readItemIDs))
|
let readMissingIDs = readItemIDs.subtracting(foundReadArticleIDs)
|
||||||
account.update(readArtices, statusKey: .starred, flag: false)
|
account.ensureStatuses(readMissingIDs, true, .starred, false)
|
||||||
|
}
|
||||||
let foundReadArticleIDs = Set(readArtices.map { $0.articleID })
|
|
||||||
let readMissingIDs = readItemIDs.subtracting(foundReadArticleIDs)
|
|
||||||
account.ensureStatuses(readMissingIDs, true, .starred, false)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncArticleState(_ account: Account, key: ArticleStatus.Key, flag: Bool, serverFeedItems: [FeedWranglerFeedItem]) {
|
func syncArticleState(_ account: Account, key: ArticleStatus.Key, flag: Bool, serverFeedItems: [FeedWranglerFeedItem]) {
|
||||||
|
@ -1195,28 +1195,27 @@ private extension FeedbinAccountDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let feedbinUnreadArticleIDs = Set(articleIDs.map { String($0) } )
|
let feedbinUnreadArticleIDs = Set(articleIDs.map { String($0) } )
|
||||||
let currentUnreadArticleIDs = account.fetchUnreadArticleIDs()
|
account.fetchUnreadArticleIDs { currentUnreadArticleIDs in
|
||||||
|
// Mark articles as unread
|
||||||
|
let deltaUnreadArticleIDs = feedbinUnreadArticleIDs.subtracting(currentUnreadArticleIDs)
|
||||||
|
let markUnreadArticles = account.fetchArticles(.articleIDs(deltaUnreadArticleIDs))
|
||||||
|
account.update(markUnreadArticles, statusKey: .read, flag: false)
|
||||||
|
|
||||||
// Mark articles as unread
|
// Save any unread statuses for articles we haven't yet received
|
||||||
let deltaUnreadArticleIDs = feedbinUnreadArticleIDs.subtracting(currentUnreadArticleIDs)
|
let markUnreadArticleIDs = Set(markUnreadArticles.map { $0.articleID })
|
||||||
let markUnreadArticles = account.fetchArticles(.articleIDs(deltaUnreadArticleIDs))
|
let missingUnreadArticleIDs = deltaUnreadArticleIDs.subtracting(markUnreadArticleIDs)
|
||||||
account.update(markUnreadArticles, statusKey: .read, flag: false)
|
account.ensureStatuses(missingUnreadArticleIDs, true, .read, false)
|
||||||
|
|
||||||
// Save any unread statuses for articles we haven't yet received
|
// Mark articles as read
|
||||||
let markUnreadArticleIDs = Set(markUnreadArticles.map { $0.articleID })
|
let deltaReadArticleIDs = currentUnreadArticleIDs.subtracting(feedbinUnreadArticleIDs)
|
||||||
let missingUnreadArticleIDs = deltaUnreadArticleIDs.subtracting(markUnreadArticleIDs)
|
let markReadArticles = account.fetchArticles(.articleIDs(deltaReadArticleIDs))
|
||||||
account.ensureStatuses(missingUnreadArticleIDs, true, .read, false)
|
account.update(markReadArticles, statusKey: .read, flag: true)
|
||||||
|
|
||||||
// Mark articles as read
|
|
||||||
let deltaReadArticleIDs = currentUnreadArticleIDs.subtracting(feedbinUnreadArticleIDs)
|
|
||||||
let markReadArticles = account.fetchArticles(.articleIDs(deltaReadArticleIDs))
|
|
||||||
account.update(markReadArticles, statusKey: .read, flag: true)
|
|
||||||
|
|
||||||
// Save any read statuses for articles we haven't yet received
|
|
||||||
let markReadArticleIDs = Set(markReadArticles.map { $0.articleID })
|
|
||||||
let missingReadArticleIDs = deltaReadArticleIDs.subtracting(markReadArticleIDs)
|
|
||||||
account.ensureStatuses(missingReadArticleIDs, true, .read, true)
|
|
||||||
|
|
||||||
|
// Save any read statuses for articles we haven't yet received
|
||||||
|
let markReadArticleIDs = Set(markReadArticles.map { $0.articleID })
|
||||||
|
let missingReadArticleIDs = deltaReadArticleIDs.subtracting(markReadArticleIDs)
|
||||||
|
account.ensureStatuses(missingReadArticleIDs, true, .read, true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncArticleStarredState(account: Account, articleIDs: [Int]?) {
|
func syncArticleStarredState(account: Account, articleIDs: [Int]?) {
|
||||||
|
@ -36,37 +36,37 @@ final class FeedlySetUnreadArticlesOperation: FeedlyOperation {
|
|||||||
|
|
||||||
let remoteUnreadArticleIds = allUnreadIdsProvider.entryIds
|
let remoteUnreadArticleIds = allUnreadIdsProvider.entryIds
|
||||||
//Set(entries.filter { $0.unread }.map { $0.id })
|
//Set(entries.filter { $0.unread }.map { $0.id })
|
||||||
let localUnreadArticleIds = account.fetchUnreadArticleIDs()
|
account.fetchUnreadArticleIDs { localUnreadArticleIds in
|
||||||
|
// Mark articles as unread
|
||||||
|
let deltaUnreadArticleIds = remoteUnreadArticleIds.subtracting(localUnreadArticleIds)
|
||||||
|
let markUnreadArticles = self.account.fetchArticles(.articleIDs(deltaUnreadArticleIds))
|
||||||
|
self.account.update(markUnreadArticles, statusKey: .read, flag: false)
|
||||||
|
|
||||||
// Mark articles as unread
|
// Save any unread statuses for articles we haven't yet received
|
||||||
let deltaUnreadArticleIds = remoteUnreadArticleIds.subtracting(localUnreadArticleIds)
|
let markUnreadArticleIDs = Set(markUnreadArticles.map { $0.articleID })
|
||||||
let markUnreadArticles = account.fetchArticles(.articleIDs(deltaUnreadArticleIds))
|
let missingUnreadArticleIDs = deltaUnreadArticleIds.subtracting(markUnreadArticleIDs)
|
||||||
account.update(markUnreadArticles, statusKey: .read, flag: false)
|
|
||||||
|
|
||||||
// Save any unread statuses for articles we haven't yet received
|
group.enter()
|
||||||
let markUnreadArticleIDs = Set(markUnreadArticles.map { $0.articleID })
|
self.account.ensureStatuses(missingUnreadArticleIDs, true, .read, false) {
|
||||||
let missingUnreadArticleIDs = deltaUnreadArticleIds.subtracting(markUnreadArticleIDs)
|
group.leave()
|
||||||
|
}
|
||||||
|
|
||||||
group.enter()
|
// Mark articles as read
|
||||||
account.ensureStatuses(missingUnreadArticleIDs, true, .read, false) {
|
let deltaReadArticleIds = localUnreadArticleIds.subtracting(remoteUnreadArticleIds)
|
||||||
group.leave()
|
let markReadArticles = self.account.fetchArticles(.articleIDs(deltaReadArticleIds))
|
||||||
}
|
self.account.update(markReadArticles, statusKey: .read, flag: true)
|
||||||
|
|
||||||
// Mark articles as read
|
// Save any read statuses for articles we haven't yet received
|
||||||
let deltaReadArticleIds = localUnreadArticleIds.subtracting(remoteUnreadArticleIds)
|
let markReadArticleIDs = Set(markReadArticles.map { $0.articleID })
|
||||||
let markReadArticles = account.fetchArticles(.articleIDs(deltaReadArticleIds))
|
let missingReadArticleIDs = deltaReadArticleIds.subtracting(markReadArticleIDs)
|
||||||
account.update(markReadArticles, statusKey: .read, flag: true)
|
group.enter()
|
||||||
|
self.account.ensureStatuses(missingReadArticleIDs, true, .read, true) {
|
||||||
|
group.leave()
|
||||||
|
}
|
||||||
|
|
||||||
// Save any read statuses for articles we haven't yet received
|
group.notify(queue: .main) {
|
||||||
let markReadArticleIDs = Set(markReadArticles.map { $0.articleID })
|
self.didFinish()
|
||||||
let missingReadArticleIDs = deltaReadArticleIds.subtracting(markReadArticleIDs)
|
}
|
||||||
group.enter()
|
|
||||||
account.ensureStatuses(missingReadArticleIDs, true, .read, true) {
|
|
||||||
group.leave()
|
|
||||||
}
|
|
||||||
|
|
||||||
group.notify(queue: .main) {
|
|
||||||
self.didFinish()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -913,28 +913,27 @@ private extension ReaderAPIAccountDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let feedbinUnreadArticleIDs = Set(articleIDs.map { String($0) } )
|
let feedbinUnreadArticleIDs = Set(articleIDs.map { String($0) } )
|
||||||
let currentUnreadArticleIDs = account.fetchUnreadArticleIDs()
|
account.fetchUnreadArticleIDs { currentUnreadArticleIDs in
|
||||||
|
// Mark articles as unread
|
||||||
|
let deltaUnreadArticleIDs = feedbinUnreadArticleIDs.subtracting(currentUnreadArticleIDs)
|
||||||
|
let markUnreadArticles = account.fetchArticles(.articleIDs(deltaUnreadArticleIDs))
|
||||||
|
account.update(markUnreadArticles, statusKey: .read, flag: false)
|
||||||
|
|
||||||
// Mark articles as unread
|
// Save any unread statuses for articles we haven't yet received
|
||||||
let deltaUnreadArticleIDs = feedbinUnreadArticleIDs.subtracting(currentUnreadArticleIDs)
|
let markUnreadArticleIDs = Set(markUnreadArticles.map { $0.articleID })
|
||||||
let markUnreadArticles = account.fetchArticles(.articleIDs(deltaUnreadArticleIDs))
|
let missingUnreadArticleIDs = deltaUnreadArticleIDs.subtracting(markUnreadArticleIDs)
|
||||||
account.update(markUnreadArticles, statusKey: .read, flag: false)
|
account.ensureStatuses(missingUnreadArticleIDs, true, .read, false)
|
||||||
|
|
||||||
// Save any unread statuses for articles we haven't yet received
|
// Mark articles as read
|
||||||
let markUnreadArticleIDs = Set(markUnreadArticles.map { $0.articleID })
|
let deltaReadArticleIDs = currentUnreadArticleIDs.subtracting(feedbinUnreadArticleIDs)
|
||||||
let missingUnreadArticleIDs = deltaUnreadArticleIDs.subtracting(markUnreadArticleIDs)
|
let markReadArticles = account.fetchArticles(.articleIDs(deltaReadArticleIDs))
|
||||||
account.ensureStatuses(missingUnreadArticleIDs, true, .read, false)
|
account.update(markReadArticles, statusKey: .read, flag: true)
|
||||||
|
|
||||||
// Mark articles as read
|
|
||||||
let deltaReadArticleIDs = currentUnreadArticleIDs.subtracting(feedbinUnreadArticleIDs)
|
|
||||||
let markReadArticles = account.fetchArticles(.articleIDs(deltaReadArticleIDs))
|
|
||||||
account.update(markReadArticles, statusKey: .read, flag: true)
|
|
||||||
|
|
||||||
// Save any read statuses for articles we haven't yet received
|
|
||||||
let markReadArticleIDs = Set(markReadArticles.map { $0.articleID })
|
|
||||||
let missingReadArticleIDs = deltaReadArticleIDs.subtracting(markReadArticleIDs)
|
|
||||||
account.ensureStatuses(missingReadArticleIDs, true, .read, true)
|
|
||||||
|
|
||||||
|
// Save any read statuses for articles we haven't yet received
|
||||||
|
let markReadArticleIDs = Set(markReadArticles.map { $0.articleID })
|
||||||
|
let missingReadArticleIDs = deltaReadArticleIDs.subtracting(markReadArticleIDs)
|
||||||
|
account.ensureStatuses(missingReadArticleIDs, true, .read, true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncArticleStarredState(account: Account, articleIDs: [Int]?) {
|
func syncArticleStarredState(account: Account, articleIDs: [Int]?) {
|
||||||
|
@ -154,8 +154,9 @@ public final class ArticlesDatabase {
|
|||||||
|
|
||||||
// MARK: - Status
|
// MARK: - Status
|
||||||
|
|
||||||
public func fetchUnreadArticleIDs() -> Set<String> {
|
/// Fetch the articleIDs of unread articles for feeds specified by webFeedIDs.
|
||||||
return articlesTable.fetchUnreadArticleIDs()
|
public func fetchUnreadArticleIDsAsync(webFeedIDs: Set<String>, callback: @escaping (Set<String>) -> Void) {
|
||||||
|
articlesTable.fetchUnreadArticleIDsAsync(webFeedIDs, callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func fetchStarredArticleIDs() -> Set<String> {
|
public func fetchStarredArticleIDs() -> Set<String> {
|
||||||
|
@ -405,6 +405,26 @@ final class ArticlesTable: DatabaseTable {
|
|||||||
return statusesTable.fetchUnreadArticleIDs()
|
return statusesTable.fetchUnreadArticleIDs()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func fetchUnreadArticleIDsAsync(_ webFeedIDs: Set<String>, _ callback: @escaping (Set<String>) -> Void) {
|
||||||
|
queue.runInDatabase { database in
|
||||||
|
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(webFeedIDs.count))!
|
||||||
|
let sql = "select articleID from articles natural join statuses where feedID in \(placeholders) and read=0 and userDeleted=0;"
|
||||||
|
let parameters = Array(webFeedIDs) as [Any]
|
||||||
|
|
||||||
|
guard let resultSet = database.executeQuery(sql, withArgumentsIn: parameters) else {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
callback(Set<String>())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let articleIDs = resultSet.mapToSet{ $0.string(forColumnIndex: 0) }
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
callback(articleIDs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func fetchStarredArticleIDs() -> Set<String> {
|
func fetchStarredArticleIDs() -> Set<String> {
|
||||||
return statusesTable.fetchStarredArticleIDs()
|
return statusesTable.fetchStarredArticleIDs()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user