Skip to content

Instantly share code, notes, and snippets.

@flyinghyrax
Last active April 2, 2017 08:41
Show Gist options
  • Save flyinghyrax/5a3ed797b0bdd4e3857827be12944995 to your computer and use it in GitHub Desktop.
Save flyinghyrax/5a3ed797b0bdd4e3857827be12944995 to your computer and use it in GitHub Desktop.
Some firebase binding code
// FirebaseValue.swift
// Created by Matt Seiler on 7/14/16.
// Copyright © 2016 Matthew Seiler. All rights reserved.
import FitnetUtils
import FirebaseDatabase
import Foundation
class FirebaseValue<T>: Observable<T?> {
private let ref: FIRDatabaseReference
private let writeConverter: (T) -> AnyObject?
private var handle: FIRDatabaseHandle?
private var _value: T? {
didSet {
notify(_value)
}
}
var value: T? {
get {
return _value
}
set {
ref.setValue(newValue.ifSet(writeConverter))
}
}
init(ref: FIRDatabaseReference, readConverter: (AnyObject) -> T?, writeConverter: (T) -> AnyObject?) {
self.ref = ref
self.writeConverter = writeConverter
super.init()
self.handle = ref.observeEventType(.Value, withBlock: { snap in
let v = snap.value.ifSet(readConverter)
self._value = v
})
}
deinit {
handle.ifSet(ref.removeObserverWithHandle)
}
}
// FirebaseValueReader.swift
// Created by Matt Seiler on 7/14/16.
// Copyright © 2016 Matthew Seiler. All rights reserved.
import BrightFutures
import Foundation
import FirebaseDatabase
/**
Reads a single value from firebase on-demand.
(Not observable/dynamic in any way.)
*/
class FirebaseValueReader<T> {
private let ref: FIRDatabaseQuery
private let converter: (AnyObject) -> T?
init(ref: FIRDatabaseQuery, converter: (AnyObject) -> T?) {
self.ref = ref
self.converter = converter
}
func read() -> Future<T?, NSError> {
let p = Promise<T?, NSError>()
ref.observeSingleEventOfType(
.Value,
withBlock: { snap in
let r = snap.value.ifSet(self.converter)
p.success(r)
},
withCancelBlock: { err in
p.failure(err)
}
)
return p.future
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment