Observable is the easiest way to observe values in Swift.
Using MutableObservable
you can create and observe event.
Using Observable
you can observe event, in order to avoid side-effects on our internal API.
class SomeViewModel {
/// Public property, that can be read / observed by external classes (e.g. view controller), but not changed.
var position: Observable<CGPoint> = {
return positionSubject
}
// Or use the helper method Observable.asObservable()
// lazy var position = positionSubject.asObservable()
/// Private property, that can be changed / observed inside this view model.
private let positionSubject = MutableObservable(CGPoint.zero)
}
In some cases Observables require resources while they're active that must be cleaned up when they're disposed of. To handle such cases you can pass an optional block to the Observable initializer to be executed when the Observable is disposed of.
url.startAccessingSecurityScopedResource()
let observable = Observable([URL]()) {
url.stopAccessingSecurityScopedResource()
}
Now mark your binded/mapped properties as observable and export public observable
//Private Observer
@MutableObservable var text: String = "Test"
//add observer
_text.observe { (newValue, oldValue) in
print(newValue)
}.add(to: &disposable)
//Public Observer
var textObserve: ImmutableObservable<String> {
return _text
}
position.observe { p in
// handle new position
}
position.observe(DispatchQueue.main) { p in
// handle new position
}
position.wrappedValue = p
position.observe {
// This will stop all observers added to `disposal`
self.disposal.dispose()
}.add(to: &disposal)
For a single observer you can store the returned Disposable
to a variable
disposable = position.observe { p in
For multiple observers you can add the disposable to a Disposal
variable
position.observe { }.add(to: &disposal)
And always weakify self
when referencing self
inside your observer
position.observe { [weak self] position in
Observable is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'Observable'
Observable is available through Swift Package Manager
.
Swift Package Manager (SwiftPM) is a tool for automating the distribution of Swift code.
It is integrated into the swift compiler and from Xcode 11, SwiftPM got natively integrated with Xcode.
dependencies: [
.package(url: "https://github.com/roberthein/Observable", from: "VERSION")
]
Observable
is nowMutableObservable
ImmutableObservable
is nowObservable
Observable.asImmutableObservable()
is nowObservable.asObservable()
Observable.value
is nowObservable.wrappedValue
Feel free to create a pull request, open an issue or find me on Twitter.