Questo potrebbe essere un bug terribile in iOS 9.3 (rilascio).KVO interrotto in iOS 9.3
Quando si aggiunge un singolo osservatore a [NSUserDefaults standardUserDefaults]
, ho notato che il metodo di risposta -observeValueForKeyPath:ofObject:change:context:
è chiamato più volte.
Nel semplice esempio seguente, ogni volta che viene premuto un UIButton, observValueForKeyPath viene attivato due volte. In esempi più complicati spara ancora più volte. È presente solo su iOS 9.3 (sia su sim che su dispositivi).
Questo può ovviamente devastare un'app. Qualcun altro vivendo lo stesso?
// 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 valore chiave osservabile? Non vedo prove che sia. Stavi facendo qualcosa che non avevi alcun mandato da fare. Non puoi lamentarti se smette di funzionare. – matt
@matt non l'ho considerato. Tuttavia, esaminandolo ho trovato quanto segue in NSUserDefaults.h: 'NSUserDefaults può essere osservato usando Key-Value Observing per qualsiasi chiave memorizzata in esso. – Matt
@Matt, sto cercando nello stesso' NSUserDefaults.h'? Non riesco a trovare il commento che hai postato in questa intestazione. –