blob: df5c505af11897d2ad0495005659f828f0cbad98 [file] [log] [blame]
//
// UIControl+RACSignalSupportPrivate.m
// ReactiveCocoa
//
// Created by Uri Baghin on 06/08/2013.
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
//
#import "UIControl+RACSignalSupportPrivate.h"
#import "RACEXTScope.h"
#import "NSInvocation+RACTypeParsing.h"
#import "NSObject+RACDeallocating.h"
#import "NSObject+RACLifting.h"
#import "RACChannel.h"
#import "RACCompoundDisposable.h"
#import "RACDisposable.h"
#import "RACSignal+Operations.h"
#import "UIControl+RACSignalSupport.h"
@implementation UIControl (RACSignalSupportPrivate)
- (RACChannelTerminal *)rac_channelForControlEvents:(UIControlEvents)controlEvents key:(NSString *)key nilValue:(id)nilValue {
NSCParameterAssert(key.length > 0);
key = [key copy];
RACChannel *channel = [[RACChannel alloc] init];
[self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{
[channel.followingTerminal sendCompleted];
}]];
RACSignal *eventSignal = [[[self
rac_signalForControlEvents:controlEvents]
mapReplace:key]
takeUntil:[[channel.followingTerminal
ignoreValues]
catchTo:RACSignal.empty]];
[[self
rac_liftSelector:@selector(valueForKey:) withSignals:eventSignal, nil]
subscribe:channel.followingTerminal];
RACSignal *valuesSignal = [channel.followingTerminal
map:^(id value) {
return value ?: nilValue;
}];
[self rac_liftSelector:@selector(setValue:forKey:) withSignals:valuesSignal, [RACSignal return:key], nil];
return channel.leadingTerminal;
}
@end