Skip to content

Instantly share code, notes, and snippets.

@tigi44
Last active January 26, 2022 02:17
Show Gist options
  • Save tigi44/bb23c51d8fc2caa59213705a00aa6d1a to your computer and use it in GitHub Desktop.
Save tigi44/bb23c51d8fc2caa59213705a00aa6d1a to your computer and use it in GitHub Desktop.
Observable.swift
class Observable<T> {
var value: T? {
didSet {
listener?(value)
}
}
private var listener: ((T?) -> Void)?
init(_ value: T?) {
self.value = value
}
bind(_ listener: @escaping (T?) -> Void) {
self.listener = listener
}
}
public final class Observable<Value> {
struct Observable<Value> {
weak var observer: AnyObject?
let block: (Value) -> Void
}
private var observers = [Observable<Value>]()
public var value: Value {
didSet { notifyObservers() }
}
public init(_ value: Value) {
self.value = value
}
public func observe(on observer: AnyObject, observerBlock: @escaping (Value) -> Void) {
observers.append(Observable(observer: observer, block: observerBlock))
observerBlock(self.value)
}
public func remove(observer: AnyObject) {
observers = observers.filter { $0.observer !== observer }
}
private func notifyObservers() {
for observer in observers {
DispatchQueue.main.async { observer.block(self.value) }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment