57 lines
1.2 KiB
Objective-C
57 lines
1.2 KiB
Objective-C
//
|
|
// 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
|