UIAlertView+RACSignalSupport.m 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // UIAlertView+RACSignalSupport.m
  3. // ReactiveObjC
  4. //
  5. // Created by Henrik Hodne on 6/16/13.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import "UIAlertView+RACSignalSupport.h"
  9. #import "RACDelegateProxy.h"
  10. #import "RACSignal+Operations.h"
  11. #import "NSObject+RACDeallocating.h"
  12. #import "NSObject+RACDescription.h"
  13. #import <objc/runtime.h>
  14. @implementation UIAlertView (RACSignalSupport)
  15. static void RACUseDelegateProxy(UIAlertView *self) {
  16. if (self.delegate == self.rac_delegateProxy) return;
  17. self.rac_delegateProxy.rac_proxiedDelegate = self.delegate;
  18. self.delegate = (id)self.rac_delegateProxy;
  19. }
  20. - (RACDelegateProxy *)rac_delegateProxy {
  21. RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd);
  22. if (proxy == nil) {
  23. proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UIAlertViewDelegate)];
  24. objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  25. }
  26. return proxy;
  27. }
  28. - (RACSignal *)rac_buttonClickedSignal {
  29. RACSignal *signal = [[[[self.rac_delegateProxy
  30. signalForSelector:@selector(alertView:clickedButtonAtIndex:)]
  31. reduceEach:^(UIAlertView *alertView, NSNumber *buttonIndex) {
  32. return buttonIndex;
  33. }]
  34. takeUntil:self.rac_willDeallocSignal]
  35. setNameWithFormat:@"%@ -rac_buttonClickedSignal", RACDescription(self)];
  36. RACUseDelegateProxy(self);
  37. return signal;
  38. }
  39. - (RACSignal *)rac_willDismissSignal {
  40. RACSignal *signal = [[[[self.rac_delegateProxy
  41. signalForSelector:@selector(alertView:willDismissWithButtonIndex:)]
  42. reduceEach:^(UIAlertView *alertView, NSNumber *buttonIndex) {
  43. return buttonIndex;
  44. }]
  45. takeUntil:self.rac_willDeallocSignal]
  46. setNameWithFormat:@"%@ -rac_willDismissSignal", RACDescription(self)];
  47. RACUseDelegateProxy(self);
  48. return signal;
  49. }
  50. @end