// // 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") }