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.
1@import PhenixSdk;23PhenixObservable<NSString*>* observable = ...; // previously obtained45id<PhenixDisposable> subscription =6 [observable subscribe:^(PhenixObservableChange<NSString*>* change) {7 NSString* newStringValue = change.value;8 // Do something with newStringValue9 }];1011// Releasing subscription will cancel it:12subscription = nil;
1import PhenixSdk23let observable: PhenixObservable<String> = ... // previously obtained45var subscription = observable.subscribe({ change in6 if let change = change, let newStringValue = change.value {7 // Do something with newStringValue8 })910// Releasing subscription will cancel it:11subscription = 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
.
1@import PhenixSdk;23PhenixObservable<NSNumber*>* roleObservable = ...; // previously obtained4PhenixMemberRole role = (PhenixMemberRole)[roleObservable getValue].intValue;56PhenixObservable<NSString*>* stringObservable = ...; // previously obtained7NSString* stringValue = [stringObservable getValue];
1import PhenixSdk23let roleObservable: PhenixObservable<NSNumber> = ... // previously obtained4let role = PhenixMemberRole(rawValue: roleObservable.getValue().intValue)56let stringObservable: PhenixObservable<NSString> = ... // previously obtained7let stringValue: String = stringObservable().getValue() as String
In swift, observables containing NSArray
need to be cast further:
1import PhenixSdk23let member: PhenixMember = ... // previously obtained45let observable: PhenixObservable<NSArray> = (member.getObservableStreams())!6let 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.
1@import PhenixSdk;23PhenixObservable<NSNumber*>* roleObservable = ...; // previously obtained4[roleObservable setValue:[NSNumber numberWithInt:PhenixMemberRolePresenter]];56PhenixObservable<NSString*>* stringObservable = ...; // previously obtained7[stringObservable setValue:@"new value"];
1import PhenixSdk23let roleObservable: PhenixObservable<NSNumber> = ... // previously obtained4roleObservable.setValue(NSNumber(value: PhenixMemberRole.presenter.rawValue))56let stringObservable: PhenixObservable<NSString> = ... // previously obtained7stringObservable.setValue("new value")