So che la documentazione dice che lo è, e so che questo argomento era già in discussione ma ho un risultato di stack interessante e non posso concludere nient'altro che lo [NSUserDefaults standardUserDefaults]
non è thread-safe. Così Io posto il mio crash log e la speranza che qualcuno vede qualcosa che non posso ...È NSUserDefaults threadsafe
Crashed Discussione
...
libdispatch.dylib 0x3ab53d67 _dispatch_client_callout + 23
libdispatch.dylib 0x3ab65e73 _dispatch_barrier_sync_f_invoke + 27
CoreFoundation 0x302b470d CFPreferencesAppSynchronize + 265
Foundation 0x30151b01 -[NSUserDefaults(NSUserDefaults) synchronize] + 25
MyApp 0x0009df8b -[AppDelegate applicationDidEnterBackground:] (AppDelegate.m:178)
...
MyApp 0x0005344b main (main.m:17)
MyApp 0x000533f8 start + 40
qualche altro thread
...
CoreFoundation 0x302bc13f _CFXPreferencesSetValue + 107
CoreFoundation 0x302bc039 CFPreferencesSetAppValue + 41
Foundation 0x30c76935 -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 61
MyApp 0x000b2e9d -[AppData parserDidEndDocument:] (AppData.m:1013)
...
parti dello stack sono stati tagliato e sostituito con "..." perché è troppo lungo e irrilevante per il soggetto. App si blocca con il messaggio:
* Collezione < __NSDictionaryM: 0x15a04ae0> è stato mutato mentre viene enumerato. ....
Codice: AppDelegate: -> filo crached ...
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults] synchronize];
}
MyClass: -> secondo thread:
-(void)parserDidEndDocument:(NSXMLParser *)parser {
...
[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"savedStations"];
[[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"lastUpdateDate"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"alreadyLoaded"];
...
}
ho questo incidente nelle coppie di altri casi, include sempre la scrittura su valori predefiniti dell'utente in un thread e la sincronizzazione in altro thread che si blocca. Se qualcuno ha qualche altra spiegazione sarei molto grato ...
Beh, se questo errore "pur essendo enumerato mutato" è stato nel codice predefinite dall'utente allora direi che non è thread-safe. – trojanfoe
Devi chiamare 'synchronise' dopo ogni modifica su' NSUserDefaults' e dal tuo codice, il secondo thread non lo chiama. – danypata
@danypata Perché devi farlo? – trojanfoe