Subscribed channels cache

This commit is contained in:
Arkadiusz Fal
2022-12-10 21:08:03 +01:00
parent 971beddc8d
commit e9c219a76e
9 changed files with 97 additions and 23 deletions

View File

@@ -0,0 +1,17 @@
import Cache
import Foundation
import Logging
import SwiftyJSON
struct BookmarksCacheModel {
static var shared = BookmarksCacheModel()
let logger = Logger(label: "stream.yattee.cache")
static let bookmarksGroup = "group.stream.yattee.app.bookmarks"
let defaults = UserDefaults(suiteName: Self.bookmarksGroup)
func clear() {
guard let defaults else { return }
defaults.dictionaryRepresentation().keys.forEach(defaults.removeObject(forKey:))
}
}

View File

@@ -10,16 +10,6 @@ struct CacheModel {
static let jsonFromDataTransformer: (Data) -> JSON = { try! JSON(data: $0) }
static let jsonTransformer = Transformer(toData: jsonToDataTransformer, fromData: jsonFromDataTransformer)
let logger = Logger(label: "stream.yattee.cache")
static let bookmarksGroup = "group.stream.yattee.app.bookmarks"
let bookmarksDefaults = UserDefaults(suiteName: Self.bookmarksGroup)
func clearBookmarks() {
guard let bookmarksDefaults else { return }
bookmarksDefaults.dictionaryRepresentation().keys.forEach(bookmarksDefaults.removeObject(forKey:))
}
func clear() {
FeedCacheModel.shared.clear()
VideosCacheModel.shared.clear()

View File

@@ -103,7 +103,7 @@ extension PlayerModel {
func removeHistory() {
removeAllWatches()
CacheModel.shared.clearBookmarks()
BookmarksCacheModel.shared.clear()
}
func removeWatch(_ watch: Watch) {

View File

@@ -1,9 +1,22 @@
import Cache
import Foundation
import Logging
import Siesta
import SwiftUI
import SwiftyJSON
final class SubscriptionsModel: ObservableObject {
static var shared = SubscriptionsModel()
let logger = Logger(label: "stream.yattee.cache.channels")
static let diskConfig = DiskConfig(name: "channels")
static let memoryConfig = MemoryConfig()
let storage = try! Storage<String, JSON>(
diskConfig: SubscriptionsModel.diskConfig,
memoryConfig: SubscriptionsModel.memoryConfig,
transformer: CacheModel.jsonTransformer
)
@Published var channels = [Channel]()
var accounts: AccountsModel { .shared }
@@ -33,17 +46,20 @@ final class SubscriptionsModel: ObservableObject {
}
func load(force: Bool = false, onSuccess: @escaping () -> Void = {}) {
guard accounts.app.supportsSubscriptions, accounts.signedIn else {
guard accounts.app.supportsSubscriptions, accounts.signedIn, let account = accounts.current else {
channels = []
return
}
loadCachedChannels(account)
let request = force ? resource?.load() : resource?.loadIfNeeded()
request?
.onSuccess { resource in
if let channels: [Channel] = resource.typedContent() {
self.channels = channels
self.storeChannels(account: account, channels: channels)
onSuccess()
}
}
@@ -52,9 +68,51 @@ final class SubscriptionsModel: ObservableObject {
}
}
func loadCachedChannels(_ account: Account) {
let cache = getChannels(account: account)
if !cache.isEmpty {
channels = cache
}
}
func storeChannels(account: Account, channels: [Channel]) {
let date = dateFormatter.string(from: Date())
logger.info("caching channels \(channelsDateCacheKey(account)) -- \(date)")
let dateObject: JSON = ["date": date]
let channelsObject: JSON = ["channels": channels.map(\.json).map(\.object)]
try? storage.setObject(dateObject, forKey: channelsDateCacheKey(account))
try? storage.setObject(channelsObject, forKey: channelsCacheKey(account))
}
func getChannels(account: Account) -> [Channel] {
logger.info("getting channels \(channelsDateCacheKey(account))")
if let json = try? storage.object(forKey: channelsCacheKey(account)),
let channels = json.dictionaryValue["channels"]
{
return channels.arrayValue.map { Channel.from($0) }
}
return []
}
private func scheduleLoad(onSuccess: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.load(force: true, onSuccess: onSuccess)
}
}
private var dateFormatter: ISO8601DateFormatter {
.init()
}
private func channelsCacheKey(_ account: Account) -> String {
"channels-\(account.id)"
}
private func channelsDateCacheKey(_ account: Account) -> String {
"channels-\(account.id)-date"
}
}

View File

@@ -8,7 +8,7 @@ struct URLBookmarkModel {
var logger = Logger(label: "stream.yattee.url-bookmark")
var allBookmarksKeys: [String] {
guard let defaults = CacheModel.shared.bookmarksDefaults else { return [] }
guard let defaults = BookmarksCacheModel.shared.defaults else { return [] }
return defaults.dictionaryRepresentation().keys.filter { $0.starts(with: Self.bookmarkPrefix) }
}
@@ -29,7 +29,7 @@ struct URLBookmarkModel {
return
}
guard let defaults = CacheModel.shared.bookmarksDefaults else {
guard let defaults = BookmarksCacheModel.shared.defaults else {
logger.error("could not open bookmarks defaults")
return
}
@@ -49,7 +49,7 @@ struct URLBookmarkModel {
return
}
guard let defaults = CacheModel.shared.bookmarksDefaults else {
guard let defaults = BookmarksCacheModel.shared.defaults else {
logger.error("could not open bookmarks defaults")
return
}
@@ -70,7 +70,7 @@ struct URLBookmarkModel {
logger.info("loading bookmark for \(bookmarkKey(urlForBookmark))")
guard let defaults = CacheModel.shared.bookmarksDefaults else {
guard let defaults = BookmarksCacheModel.shared.defaults else {
logger.error("could not open bookmarks defaults")
return nil
}
@@ -103,7 +103,7 @@ struct URLBookmarkModel {
func removeBookmark(_ url: URL) {
logger.info("removing bookmark for \(bookmarkKey(url))")
guard let defaults = CacheModel.shared.bookmarksDefaults else {
guard let defaults = BookmarksCacheModel.shared.defaults else {
logger.error("could not open bookmarks defaults")
return
}