UIControl+RACSignalSupportPrivate.m 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. //
  2. // UIControl+RACSignalSupportPrivate.m
  3. // ReactiveObjC
  4. //
  5. // Created by Uri Baghin on 06/08/2013.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import "UIControl+RACSignalSupportPrivate.h"
  9. #import "NSObject+RACDeallocating.h"
  10. #import "NSObject+RACLifting.h"
  11. #import "RACChannel.h"
  12. #import "RACCompoundDisposable.h"
  13. #import "RACDisposable.h"
  14. #import "RACSignal+Operations.h"
  15. #import "UIControl+RACSignalSupport.h"
  16. @implementation UIControl (RACSignalSupportPrivate)
  17. - (RACChannelTerminal *)rac_channelForControlEvents:(UIControlEvents)controlEvents key:(NSString *)key nilValue:(id)nilValue {
  18. NSCParameterAssert(key.length > 0);
  19. key = [key copy];
  20. RACChannel *channel = [[RACChannel alloc] init];
  21. [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{
  22. [channel.followingTerminal sendCompleted];
  23. }]];
  24. RACSignal *eventSignal = [[[self
  25. rac_signalForControlEvents:controlEvents]
  26. mapReplace:key]
  27. takeUntil:[[channel.followingTerminal
  28. ignoreValues]
  29. catchTo:RACSignal.empty]];
  30. [[self
  31. rac_liftSelector:@selector(valueForKey:) withSignals:eventSignal, nil]
  32. subscribe:channel.followingTerminal];
  33. RACSignal *valuesSignal = [channel.followingTerminal
  34. map:^(id value) {
  35. return value ?: nilValue;
  36. }];
  37. [self rac_liftSelector:@selector(setValue:forKey:) withSignals:valuesSignal, [RACSignal return:key], nil];
  38. return channel.leadingTerminal;
  39. }
  40. @end