Skip to content

Instantly share code, notes, and snippets.

@JRGould
Last active April 19, 2017 15:05
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JRGould/c90eba4ad9ab363e4d602aff4d6e5799 to your computer and use it in GitHub Desktop.
Save JRGould/c90eba4ad9ab363e4d602aff4d6e5799 to your computer and use it in GitHub Desktop.
Swift shared data singleton with data persistence and simple callback support
/**
Usage: var mySharedData = SharedData.instance
*/
class SharedData {
static let instance: SharedData = {
let instance = SharedData()
// Update instance.defaultsName if desired
if let defaults = NSUserDefaults.standardUserDefaults().objectForKey(instance.defaultsName) as? [String:AnyObject] {
instance.data = defaults
}
return instance
}()
typealias Callback = (Any) -> Void
internal var defaultsName = "SharedDataObject"
private var watches = [String:[Callback]]()
private var data = [String: Any]()
private init() {
// Init
}
subscript(key: String) -> Any? {
get {
return self.data[key] ?? nil
}
set(newValue) {
if let value = newValue {
self.data[key] = value
NSUserDefaults.standardUserDefaults().setObject(self.data as? AnyObject, forKey: self.defaultsName)
self.trigger(key, value: value)
}
}
}
func watch(key: String, callback: Callback) -> Void{
if var callbacks = self.watches[key] {
callbacks.append(callback)
} else {
self.watches[key] = [callback]
}
}
func trigger(key: String, value: Any) -> Void{
guard let callbacks = self.watches[key] else {
return
}
for callback: Callback in callbacks {
callback(value)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment