Tusker/Tusker/MastodonCache.swift

80 lines
2.2 KiB
Swift

//
// StatusCache.swift
// Tusker
//
// Created by Shadowfacts on 9/17/18.
// Copyright © 2018 Shadowfacts. All rights reserved.
//
import Foundation
import Pachyderm
class MastodonCache {
private static let statuses = NSCache<NSString, Status>()
private static let accounts = NSCache<NSString, Account>()
// MARK: - Statuses
static func status(for id: String) -> Status? {
return statuses.object(forKey: id as NSString)
}
static func set(status: Status, for id: String) {
statuses.setObject(status, forKey: id as NSString)
add(account: status.account)
if let reblog = status.reblog {
add(account: reblog.account)
}
}
static func status(for id: String, completion: @escaping (Status?) -> Void) {
let request = MastodonController.shared.client.getStatus(id: id)
MastodonController.shared.client.run(request) { response in
guard case let .success(status, _) = response else {
completion(nil)
return
}
set(status: status, for: id)
completion(status)
}
}
static func add(status: Status) {
set(status: status, for: status.id)
}
static func addAll(statuses: [Status]) {
statuses.forEach(add)
}
// MARK: - Accounts
static func account(for id: String) -> Account? {
return accounts.object(forKey: id as NSString)
}
static func set(account: Account, for id: String) {
accounts.setObject(account, forKey: id as NSString)
}
static func account(for id: String, completion: @escaping (Account?) -> Void) {
let request = MastodonController.shared.client.getAccount(id: id)
MastodonController.shared.client.run(request) { response in
guard case let .success(account, _) = response else {
completion(nil)
return
}
set(account: account, for: account.id)
completion(account)
}
}
static func add(account: Account) {
set(account: account, for: account.id)
}
static func addAll(accounts: [Account]) {
accounts.forEach(add)
}
}