2013-10-21 18 views
7

Belgelerin şu olduğunu söylediğini biliyorum ve bu konunun zaten tartışılmakta olduğunu biliyorum ancak ilginç bir yığın sonucum var ve başka hiçbir şey yapamam, ancak bu [NSUserDefaults standardUserDefaults] threadafe değildir. Yani benim kilitlenme günlüğünüzü yayınlayıp umut olacağı birileriNSUserDefaults threadafe

Konu

... 
    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 

yığının

... 
    CoreFoundation 0x302bc13f _CFXPreferencesSetValue + 107 
    CoreFoundation 0x302bc039 CFPreferencesSetAppValue + 41 
    Foundation 0x30c76935 -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 61 
    MyApp 0x000b2e9d -[AppData parserDidEndDocument:] (AppData.m:1013) 
    ... 

Parçaları edilmiş bazı iplik Çöktü Yapamam ... şey görür kesildi ve "..." ile değiştirildi, çünkü konu için çok uzun ve ilgisiz. Uygulama mesajla çöker:

* Koleksiyon < __NSDictionaryM: 0x15a04ae0> sayılan olurken mutasyona uğratıldı. ....

Kodu: AppDelegate: -> crached iplik ...

- (void)applicationDidEnterBackground:(UIApplication *)application 
    { 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 

sınıfının: -> ikinci thread:

-(void)parserDidEndDocument:(NSXMLParser *)parser { 
    ... 
     [[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"savedStations"]; 
     [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"lastUpdateDate"]; 
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"alreadyLoaded"]; 
    ... 
    } 

Ben çiftin bu çökme var Diğer durumlarda, her zaman bir iş parçacığında kullanıcı varsayılanlarına bazı yazma ve kilitlenen diğer iş parçacığı eşitleme içerir .. Herkes başka bir açıklama varsa çok iyi olurdu ...

+2

'NSUserDefaults'daki her değişiklikten sonra ve kodunuzdan' synise 'çağırmanız gerekiyor, ikinci thread bunu çağırmıyor. – danypata

+1

@danypata Bunu neden yapmak zorundasınız? – trojanfoe

cevap

-7

nsuserdefaults iş parçacığı güvenli değil. Herhangi bir ios terimi için iş parçacığı güvenliğini ele almıyorsa, lütfen elma dokümantasyonunu kontrol edin. Eğer iş parçacığı güvenli değilse ....

+1

Diğer cevaptaki yoruma göre, belgeler iddia ettiğin şeyin tam tersini söylüyor. Https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html sayfasına bakın ve Genel Bakış'ın son tümceyi okuyun. – Tommy

+0

Noel'de cevapladı. Kötü ruh hali için onu biraz gevşet. – Jameson

3

NSUserDefaults sınıfı, iş parçacığı için güvenlidir.

(c) "mutasyona uğramış sayılan olurken" hata sonra ben parçacığının güvenli değil söyleyebilirim kullanıcı varsayılan kodda olduğu Eh eğer