Last active
May 19, 2017 16:59
-
-
Save johndpope/1dd3663a8712bb1901536a44bccd6a5a to your computer and use it in GitHub Desktop.
Attempt to decouple nsarchiver from dotzu
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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