forked from shadowfacts/Tusker
62 lines
1.9 KiB
Swift
62 lines
1.9 KiB
Swift
//
|
|
// SavedInstancesManager.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 12/19/19.
|
|
// Copyright © 2019 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
class SavedInstanceManager: Codable {
|
|
private(set) static var shared: SavedInstanceManager = load()
|
|
|
|
private static var documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
|
|
private static var archiveURL = SavedInstanceManager.documentsDirectory.appendingPathComponent("saved_instances").appendingPathExtension("plist")
|
|
|
|
static func save() {
|
|
DispatchQueue.global(qos: .utility).async {
|
|
let encoder = PropertyListEncoder()
|
|
let data = try? encoder.encode(shared)
|
|
try? data?.write(to: archiveURL, options: .noFileProtection)
|
|
}
|
|
}
|
|
|
|
static func load() -> SavedInstanceManager {
|
|
let decoder = PropertyListDecoder()
|
|
if let data = try? Data(contentsOf: archiveURL),
|
|
let savedInstanceManager = try? decoder.decode(Self.self, from: data) {
|
|
return savedInstanceManager
|
|
}
|
|
return SavedInstanceManager()
|
|
}
|
|
|
|
private init() {}
|
|
|
|
private(set) var savedInstances: [URL] = []
|
|
|
|
func isSaved(_ url: URL) -> Bool {
|
|
return savedInstances.contains(url)
|
|
}
|
|
|
|
func add(_ url: URL) {
|
|
if isSaved(url) {
|
|
return
|
|
}
|
|
savedInstances.append(url)
|
|
SavedInstanceManager.save()
|
|
NotificationCenter.default.post(name: .savedInstancesChanged, object: nil)
|
|
}
|
|
|
|
func remove(_ url: URL) {
|
|
guard isSaved(url) else { return }
|
|
savedInstances.removeAll(where: { $0 == url })
|
|
SavedInstanceManager.save()
|
|
NotificationCenter.default.post(name: .savedInstancesChanged, object: nil)
|
|
}
|
|
}
|
|
|
|
extension Notification.Name {
|
|
static let savedInstancesChanged = Notification.Name("savedInstancesChanged")
|
|
}
|