Observable
Observe value changes. Similar to the ReactiveX Behavior Subject.
Important differences for Phenix SDK observables:
- There is always an initial value (which can be
nil
for some objects) - Only if observed value changes will subscribers get notified
Point 1 means that when subscribing, you will always get notified immediately with the current value. This is guaranteed atomic, meaning that you do not have to worry about missing any observable updates.
PhenixObservable
Name | Signature | Returns | Description |
---|---|---|---|
subscribe | (onChanged) | PhenixDisposable | See Subscribe to an Observable |
getValue | () | varies | See Get Observable Value |
setValue | (value) | void | See Set Observable Value |
Subscribe to an Observable
Receive a notification every time the observable value changes.
@import PhenixSdk;
PhenixObservable<NSString*>* observable = ...; // previously obtained
id<PhenixDisposable> subscription =
[observable subscribe:^(PhenixObservableChange<NSString*>* change) {
NSString* newStringValue = change.value;
// Do something with newStringValue
}];
// Releasing subscription will cancel it:
subscription = nil;
Parameters
Name | Type | Description |
---|---|---|
onChanged (required) | Function | Function to call when value changes |
PhenixDisposable
Has no methods. Dropping the last reference will automatically cancel the subscription.
Get Observable Value
Synchronous method allowing retrieval of currently set value. Thread safe.
Note: Since enums are not full objects, they are proxied via NSNumber
.
@import PhenixSdk;
PhenixObservable<NSNumber*>* roleObservable = ...; // previously obtained
PhenixMemberRole role = (PhenixMemberRole)[roleObservable getValue].intValue;
PhenixObservable<NSString*>* stringObservable = ...; // previously obtained
NSString* stringValue = [stringObservable getValue];
In swift, observables containing NSArray
need to be cast further:
import PhenixSdk
let member: PhenixMember = ... // previously obtained
let observable: PhenixObservable<NSArray> = (member.getObservableStreams())!
let streams: [PhenixStream] = observable.getValue() as! [PhenixStream]
Set Observable Value
Change the observable value. This will trigger notifications on all subscribers.
Enums require special attention when being set.
@import PhenixSdk;
PhenixObservable<NSNumber*>* roleObservable = ...; // previously obtained
[roleObservable setValue:[NSNumber numberWithInt:PhenixMemberRolePresenter]];
PhenixObservable<NSString*>* stringObservable = ...; // previously obtained
[stringObservable setValue:@"new value"];