NSUserDefaults+RACSupport.m 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. //
  2. // NSUserDefaults+RACSupport.m
  3. // ReactiveObjC
  4. //
  5. // Created by Matt Diephouse on 12/19/13.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import "NSUserDefaults+RACSupport.h"
  9. #import <ReactiveObjC/RACEXTScope.h>
  10. #import "NSNotificationCenter+RACSupport.h"
  11. #import "NSObject+RACDeallocating.h"
  12. #import "RACChannel.h"
  13. #import "RACScheduler.h"
  14. #import "RACSignal+Operations.h"
  15. @implementation NSUserDefaults (RACSupport)
  16. - (RACChannelTerminal *)rac_channelTerminalForKey:(NSString *)key {
  17. NSParameterAssert(key != nil);
  18. RACChannel *channel = [RACChannel new];
  19. RACScheduler *scheduler = [RACScheduler scheduler];
  20. __block BOOL ignoreNextValue = NO;
  21. @weakify(self);
  22. [[[[[[[NSNotificationCenter.defaultCenter
  23. rac_addObserverForName:NSUserDefaultsDidChangeNotification object:self]
  24. map:^(id _) {
  25. @strongify(self);
  26. return [self objectForKey:key];
  27. }]
  28. startWith:[self objectForKey:key]]
  29. // Don't send values that were set on the other side of the terminal.
  30. filter:^ BOOL (id _) {
  31. if (RACScheduler.currentScheduler == scheduler && ignoreNextValue) {
  32. ignoreNextValue = NO;
  33. return NO;
  34. }
  35. return YES;
  36. }]
  37. distinctUntilChanged]
  38. takeUntil:self.rac_willDeallocSignal]
  39. subscribe:channel.leadingTerminal];
  40. [[channel.leadingTerminal
  41. deliverOn:scheduler]
  42. subscribeNext:^(id value) {
  43. @strongify(self);
  44. ignoreNextValue = YES;
  45. [self setObject:value forKey:key];
  46. }];
  47. return channel.followingTerminal;
  48. }
  49. @end