| // |
| // NSUserDefaults+RACSupport.m |
| // ReactiveCocoa |
| // |
| // Created by Matt Diephouse on 12/19/13. |
| // Copyright (c) 2013 GitHub, Inc. All rights reserved. |
| // |
| |
| #import "NSUserDefaults+RACSupport.h" |
| |
| #import "RACEXTScope.h" |
| #import "RACChannel.h" |
| #import "RACScheduler.h" |
| #import "RACSignal+Operations.h" |
| #import "NSNotificationCenter+RACSupport.h" |
| #import "NSObject+RACDeallocating.h" |
| #import "NSObject+RACLifting.h" |
| |
| @implementation NSUserDefaults (RACSupport) |
| |
| - (RACChannelTerminal *)rac_channelTerminalForKey:(NSString *)key { |
| RACChannel *channel = [RACChannel new]; |
| |
| RACScheduler *scheduler = [RACScheduler scheduler]; |
| __block BOOL ignoreNextValue = NO; |
| |
| @weakify(self); |
| [[[[[[[NSNotificationCenter.defaultCenter |
| rac_addObserverForName:NSUserDefaultsDidChangeNotification object:self] |
| map:^(id _) { |
| @strongify(self); |
| return [self objectForKey:key]; |
| }] |
| startWith:[self objectForKey:key]] |
| // Don't send values that were set on the other side of the terminal. |
| filter:^ BOOL (id _) { |
| if (RACScheduler.currentScheduler == scheduler && ignoreNextValue) { |
| ignoreNextValue = NO; |
| return NO; |
| } |
| return YES; |
| }] |
| distinctUntilChanged] |
| takeUntil:self.rac_willDeallocSignal] |
| subscribe:channel.leadingTerminal]; |
| |
| [[channel.leadingTerminal |
| deliverOn:scheduler] |
| subscribeNext:^(id value) { |
| @strongify(self); |
| ignoreNextValue = YES; |
| [self setObject:value forKey:key]; |
| }]; |
| |
| return channel.followingTerminal; |
| } |
| |
| @end |