1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- //
- // RACBehaviorSubject.m
- // ReactiveObjC
- //
- // Created by Josh Abernathy on 3/16/12.
- // Copyright (c) 2012 GitHub, Inc. All rights reserved.
- //
- #import "RACBehaviorSubject.h"
- #import "RACDisposable.h"
- #import "RACScheduler+Private.h"
- @interface RACBehaviorSubject<ValueType> ()
- // This property should only be used while synchronized on self.
- @property (nonatomic, strong) ValueType currentValue;
- @end
- @implementation RACBehaviorSubject
- #pragma mark Lifecycle
- + (instancetype)behaviorSubjectWithDefaultValue:(id)value {
- RACBehaviorSubject *subject = [self subject];
- subject.currentValue = value;
- return subject;
- }
- #pragma mark RACSignal
- - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
- RACDisposable *subscriptionDisposable = [super subscribe:subscriber];
- RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
- @synchronized (self) {
- [subscriber sendNext:self.currentValue];
- }
- }];
-
- return [RACDisposable disposableWithBlock:^{
- [subscriptionDisposable dispose];
- [schedulingDisposable dispose];
- }];
- }
- #pragma mark RACSubscriber
- - (void)sendNext:(id)value {
- @synchronized (self) {
- self.currentValue = value;
- [super sendNext:value];
- }
- }
- @end
|