Invalidate the subscription feed when subscriptions change (#968)

Subscribing or unsubscribing, locally or via iCloud, only posted a
notification, so the cached feed stayed valid and Yattee Server never
received the new channel list until the cache expired. Invalidate the
feed cache on every subscription add and removal, and skip the disk
write when it is already stale.
This commit is contained in:
Arkadiusz Fal
2026-10-19 22:54:55 +02:00
parent 433e57e68d
commit 4d8ba7e028
3 changed files with 11 additions and 3 deletions

View File

@@ -104,7 +104,8 @@ actor FeedCache {
/// Invalidates the cache by clearing the lastUpdated timestamp.
/// The cached videos remain available but will be considered stale.
func invalidate() async {
guard var data = cachedData else { return }
// Already stale: skip the disk write (remote syncs invalidate once per record).
guard var data = cachedData, data.lastUpdated != .distantPast else { return }
data.lastUpdated = .distantPast
cachedData = data
await save(videos: data.videos, lastUpdated: .distantPast)

View File

@@ -31,7 +31,10 @@ extension DataManager {
// Queue for CloudKit sync
cloudKitSync?.queueSubscriptionSave(subscription)
// The stateless feed must be rebuilt from the new channel list (#968)
SubscriptionFeedCache.shared.invalidate()
let change = SubscriptionChange(addedSubscriptions: [subscription], removedChannelIDs: [])
NotificationCenter.default.post(
name: .subscriptionsDidChange,
@@ -71,6 +74,8 @@ extension DataManager {
cloudKitSync?.queueSubscriptionDelete(channelID: channelID, scope: scope)
}
SubscriptionFeedCache.shared.invalidate()
let change = SubscriptionChange(addedSubscriptions: [], removedChannelIDs: [channelID])
NotificationCenter.default.post(
name: .subscriptionsDidChange,

View File

@@ -2693,7 +2693,8 @@ extension CloudKitSyncEngine: CKSyncEngineDelegate {
} else {
// New subscription from iCloud
dataManager.insertSubscription(subscription)
SubscriptionFeedCache.shared.invalidate()
// Post notification to update UI
let change = SubscriptionChange(addedSubscriptions: [subscription], removedChannelIDs: [])
NotificationCenter.default.post(
@@ -3125,6 +3126,7 @@ extension CloudKitSyncEngine: CKSyncEngineDelegate {
if let subscription = localSubscription(matching: recordName, channelID: channelID, in: dataManager) {
dataManager.deleteSubscription(subscription)
dataManager.save()
SubscriptionFeedCache.shared.invalidate()
let change = SubscriptionChange(addedSubscriptions: [], removedChannelIDs: [channelID])
NotificationCenter.default.post(
name: .subscriptionsDidChange,