Skip to content

Instantly share code, notes, and snippets.

@johndpope
Last active May 19, 2017 16:59
Show Gist options
  • Save johndpope/1dd3663a8712bb1901536a44bccd6a5a to your computer and use it in GitHub Desktop.
Save johndpope/1dd3663a8712bb1901536a44bccd6a5a to your computer and use it in GitHub Desktop.
Attempt to decouple nsarchiver from dotzu
//
// StoreManager.swift
// exampleWindow
//
// Created by Remi Robert on 17/01/2017.
// Copyright © 2017 Remi Robert. All rights reserved.
//
import Foundation
//optional
import PINCache
enum StoreManagerType: String {
case log = "logs"
case network = "network"
case crash = "crashs"
}
/*
protocol LogProvider {
func archiveLogs(logs: [T])
func storedDataForKey(key:String)->NSData?
func logs() -> [T]
func reset()
}
*/
class DefaultLogProvider<T> where T: NSCoding {
private let store: StoreManagerType
init(store: StoreManagerType) {
self.store = store
}
func archiveLogs(logs: [T]) {
let dataArchive = NSKeyedArchiver.archivedData(withRootObject: logs)
UserDefaults.standard.set(dataArchive, forKey: store.rawValue)
UserDefaults.standard.synchronize()
}
func storedDataForKey(key:String)->NSData?{
return UserDefaults.standard.object(forKey: key) as? NSData
}
func logs() -> [T]{
guard let data = storedDataForKey(key: store.rawValue) else {return []}
do {
let dataArchive = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
return dataArchive as? [T] ?? []
} catch {
return []
}
}
func reset() {
UserDefaults.standard.removeObject(forKey: store.rawValue)
UserDefaults.standard.synchronize()
}
}
class PINCacheLogProvider<T> where T: NSCoding {
private let store: StoreManagerType
init(store: StoreManagerType) {
self.store = store
}
func archiveLogs(logs: [T]) {
PINCache.shared.setObject(logs, forKey:store.rawValue)
// let dataArchive = NSKeyedArchiver.archivedData(withRootObject: logs)
// UserDefaults.standard.set(dataArchive, forKey: store.rawValue)
// UserDefaults.standard.synchronize()
}
// TODO make async
func storedDataForKey(key:String)->NSData?{
return PINCache.shared.object(forKey: key) as? NSData
// PINCache.shared.object(forKeyAsync:targetKey, completion: { (cache, key, object) in
// if let stars = object as? [FavoritedSuperstar] {
// print("stars:", stars)
// WWEData.shared.favoriteSuperStars = stars
// }
// })
// return UserDefaults.standard.object(forKey: key) as? NSData
}
func logs() -> [T]{
guard let data = storedDataForKey(key: store.rawValue) else {return []}
return data
// do {
// let dataArchive = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
// return dataArchive as? [T] ?? []
// } catch {
// return []
// }
}
func reset() {
PINCache.shared.removeObject(forKeyAsync: store.rawValue) { (cache, key, object) in
}
}
}
class StoreManager<T> where T: NSCoding {
open var provider: DefaultLogProvider<Log>
init(store: StoreManagerType) {
self.provider = DefaultLogProvider(store: store)
}
/*
init(store: StoreManagerType,provider:LogProvider) {
self.provider = provider
}
*/
private func archiveLogs(logs: [T]) {
self.provider.archiveLogs(logs:logs as! [Log])
}
func storedDataForKey(key:String)->NSData?{
return self.provider.storedDataForKey(key:key)
}
func add(log: T) {
var logs = self.logs()
logs.append(log)
archiveLogs(logs: logs)
}
func save(logs: [T]) {
archiveLogs(logs: logs)
}
func logs() -> [T] {
return self.provider.logs() as! [T]
}
func reset() {
self.provider.reset()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment