Это может быть ужасная ошибка в iOS 9.3 (выпуск).KVO, сломанный в iOS 9.3
При добавлении одного наблюдателя в [NSUserDefaults standardUserDefaults]
Я заметил, что ответный метод -observeValueForKeyPath:ofObject:change:context:
вызывается несколько раз.
В простом примере ниже, каждый раз, когда UIButton нажимается один раз, watchValueForKeyPath срабатывает дважды. В более сложных примерах он срабатывает еще больше раз. Он присутствует только на iOS 9.3 (как на сим, так и на устройствах).
Возможно, это может привести к хаосу приложения. Кто-нибудь другой испытывает то же самое?
// ViewController.m (barebones, single view app)
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad");
[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"SomeKey" options:NSKeyValueObservingOptionNew context:NULL];
}
- (IBAction)buttonPressed:(id)sender {
NSLog(@"buttonPressed");
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"SomeKey"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
NSLog(@"observeValueForKeyPath: %@", keyPath);
}
ли значение ключа NSUserDefaults наблюдаемым? Я не вижу никаких доказательств. Вы делали то, что у вас не было никаких ордеров. Вы не можете жаловаться, если он перестает работать. – matt
@matt Я этого не думал. Однако, изучая это, я нашел следующее в NSUserDefaults.h: «NSUserDefaults можно наблюдать с помощью проверки значения ключа для любого сохраненного в нем ключа.» – Matt
@Matt, Я смотрю в том же «NSUserDefaults.h»? Я не могу найти комментарий, который вы разместили в этом заголовке. –