2008-09-24 24 views
11

Apple'ın documentation on -setPrimitiveValue:forKey:, birçok ilişkiyi yönetmek için kullanması durumunda iki şekilde belirsizdir.setPrimitiveValue: forKey: ve çoktan çoğa ilişkileri

Önce devlet:

Yeni NSMutableSet nesnesine-çok ilişki kurmak için denerseniz, (sonunda) başarısız olur.

Sonunda ?! Bu ne anlama geliyor? -[NSManagedObjectContext save:] sırasında başarısız olur mu? Yönetilen bir nesne bir hataya dönüştürüldüğünde ve sonra tekrar sayfalanmış mı? Ne zaman? İsteğe bağlı başarısızlığı sürekli olarak yeniden oluşturmak için bir test vakası yazabilir miyim?

İkincisi, örnek kodlar sağlayarak doğru bu durumun ele alınması, yazdıkları:

ilk ne yapmalıyım

(nil dönmez yöntemini sağlamak) primitiveValueForKey: kullanarak mevcut set almak yönteminin ne zaman geri döndüğü? assert() ve hemen başarısız çünkü bu, tüm nesne grafiğinin bozuk olduğu ve kaydetmenin veri kaybına neden olacağı anlamına geliyor? NSAssert(), arayan kişiye bir uyarı olarak, ancak (hiçbir şey yapmadan sessizce) tuşuna basar mı?

Şu anda sadece doğrudan atama ediyorum benim şöyle bu durumda NS[Mutable]Set, istenen:

- (void)setChildren:(NSSet*)value_ { 
    NSMutableSet *mutableRelationshipSet = [[[self primitiveValueForKey:@"children"] mutableCopy] autorelease]; 
    if (mutableRelationshipSet) { 
     [mutableRelationshipSet setSet:value_]; 
     [self setPrimitiveValue:mutableRelationshipSet forKey:@"children"]; 
    } else { 
     [self setPrimitiveValue:value_ forKey:@"children"]; 
    } 
} 

yanlış mı?

cevap

6

Yalnızca dönüş değeri -primitiveValueForKey: değerini değiştirilebilen bir değer olarak değiştirerek, dönüş değerinin doğru olanı yapacağını doğrulayın.

Ayrıca, manipülasyonunuzun etrafında -willChangeValueForKey:withSetMutation:usingObjects: ve -didChangeValueForKey:withSetMutation:usingObjects:'u da kullandığınızdan emin olun; Bunu yukarıdaki kodunuzda göstermediniz.

- (void)setChildren:(NSSet *)value { 
    [self willChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value]; 

    NSMutableSet *primitiveValue = [self primitiveValueForKey:@"children"]; 

    [primitiveValue setSet:value]; 

    [self didChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value]; 
} 

Leopard'ı hedefleyebiliyorsanız, bunun için endişelenmenize gerek yoktur; kullanabileceğiniz Çekirdek Veri yerleşik yerine mülkiyet desteği: bunun üzerine -mutableSetValueForKey: kullanabilmesi

#import <CoreData/CoreData.h> 

@interface Folder : NSManagedObject 
@property (readwrite, retain) NSSet *children; 
@end 

@implementation Folder 
@dynamic children; 
@end 

Çekirdek Veri yanı children mülkiyet ama değişken-set erişimcilerine için alıcı/ayarlayıcı çifti sadece üretecektir ve sonucu minimum yük ile manipüle edin.