55 lines
1.5 KiB
Objective-C
55 lines
1.5 KiB
Objective-C
//
|
|
// RACDynamicSignal.m
|
|
// ReactiveObjC
|
|
//
|
|
// Created by Justin Spahr-Summers on 2013-10-10.
|
|
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
|
|
//
|
|
|
|
#import "RACDynamicSignal.h"
|
|
#import <ReactiveObjC/RACEXTScope.h>
|
|
#import "RACCompoundDisposable.h"
|
|
#import "RACPassthroughSubscriber.h"
|
|
#import "RACScheduler+Private.h"
|
|
#import "RACSubscriber.h"
|
|
#import <libkern/OSAtomic.h>
|
|
|
|
@interface RACDynamicSignal ()
|
|
|
|
// The block to invoke for each subscriber.
|
|
@property (nonatomic, copy, readonly) RACDisposable * (^didSubscribe)(id<RACSubscriber> subscriber);
|
|
|
|
@end
|
|
|
|
@implementation RACDynamicSignal
|
|
|
|
#pragma mark Lifecycle
|
|
|
|
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
|
|
RACDynamicSignal *signal = [[self alloc] init];
|
|
signal->_didSubscribe = [didSubscribe copy];
|
|
return [signal setNameWithFormat:@"+createSignal:"];
|
|
}
|
|
|
|
#pragma mark Managing Subscribers
|
|
|
|
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
|
|
NSCParameterAssert(subscriber != nil);
|
|
|
|
RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
|
|
subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];
|
|
|
|
if (self.didSubscribe != NULL) {
|
|
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
|
|
RACDisposable *innerDisposable = self.didSubscribe(subscriber);
|
|
[disposable addDisposable:innerDisposable];
|
|
}];
|
|
|
|
[disposable addDisposable:schedulingDisposable];
|
|
}
|
|
|
|
return disposable;
|
|
}
|
|
|
|
@end
|