2013-04-06 29 views
18

CoreData'yı kullanarak, bir varlık yarattım, sonra onu kendi dosyasında, @propertys'in olduğu bir alt sınıfta, sonra da .m dosyasında @dynamic parçaları var. Ben set olmamıştı eğer bir şey belli değere sahip istediğinizdeCoreData ile, bir @dynamic özelliğime sahipse, geticisini tıpkı @ sentezlendiği gibi geçersiz kılabilir miyim? (Lazy Instantiation)

, aşağıdaki gibi hep Tembel örnekleme kullanın:

- (NSString *)preview { 
    if ([self.body length] < 200) { 
     _preview = self.body; 
    } 
    else { 
     _preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
    } 

    return _preview; 
} 

Ama @dynamic özelliklere sahip bu nasıl yapacağım? Aynı şeyi yaparsam, _preview bildirilmemiş bir özellik olduğunu söylüyor, ancak .h dosyasında. Tembelleştirmek için farklı ne yapabilirim? primitiveValueForKey:

temel olarak kullanımı ile ilgili

+1

Bu adla bir değişkeniniz olmadığı için _preview' undeclarged _indentifier_ yazıyor. 'sentezleme 'değişkenini oluşturur; 'dinamik 'değil. –

cevap

27

bir standart yöntem (Çekirdek veri modelinde geçici nitelik olarak preview tanımlamaktır veritabanında) ve özel bir getter yöntemi uygular. gibi durumda görünecektir:..

- (NSString *)preview 
{ 
    [self willAccessValueForKey:@"preview"]; 
    NSString *preview = [self primitiveValueForKey:@"preview"]; 
    [self didAccessValueForKey:@"preview"]; 
    if (preview == nil) { 
     if ([self.body length] < 200) { 
      preview = self.body; 
     } else { 
      preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
     } 
     [self setPrimitiveValue:preview forKey:@"preview"]; 
    } 
    return preview; 
} 

(Sen özel oltalarını, @dynamic özellikleri için ayarlayıcı yöntemleri sağlayabilir Ancak, Çekirdek Veri özellikleri sadece örnek değişkenler tarafından yedeklenmeyen İşte nedeni neden değil body öznitelik değişikliklerini ise preview yeniden hesaplanacak gerekiyorsa erişim _preview.)

, o zaman da geri nil için preview setleri body için özel ayarlayıcı yöntemi uygulamalıdır olabilir.

Daha fazla bilgi için, "Çekirdek Verileri Programlama Kılavuzu" nda Non-Standard Persistent Attributes konusunu okuyun.

Güncelleştirme: Çekirdek Veri Programlama Kılavuzu'nun geçerli sürümü, artık bu bölümü içermeyen yapmıyor. numaralı bir arşivlenmiş sürümü Way Back Machine'dan bulabilirsiniz. Tabii ki bu, resmi dokümantasyonunun bir parçası olmadığından, bir tuz tohumu ile alınmalıdır.

+0

Mükemmel cevap @Martin. – satheeshwaran

+0

@satheeshwaran: Teşekkürler. –

+0

Yapılması gereken tek şey bu yöntemi kullanmak mı? Veya CoreData dosyasında bir şey yapmalı mıyım? – user212541

6

See documentation: değeri gerçekten depolandığı değildir, böylece

@dynamic name; 

- (NSString *)name 
{ 
    [self willAccessValueForKey:@"name"]; 
    NSString *myName = [self primitiveName]; 
    [self didAccessValueForKey:@"name"]; 
    return myName; 
} 

- (void)setName:(NSString *)newName 
{ 
    [self willChangeValueForKey:@"name"]; 
    [self setPrimitiveName:newName]; 
    [self didChangeValueForKey:@"name"]; 
}