7

Bir NSManagedObject iki ile özellikleri vardır.Autoupdating NSManagedObject özellik düzeltme damgası

Tabi bazen zaman zaman kaydediliyor ve score_timestamp güncel olmayacak çünkü -willSave yöntemini kullanamazsınız. Bu yüzden, -setScore:'u geçersiz kılmalı veya yönetilen nesneyi kendi score alanı için bir anahtar/değer gözlemcisi olarak ayarlamalıyım.

-setScore: çözüm kolay görünüyor:

- (void) setScore:(NSNumber *)score 
{ 
    [self willChangeValueForKey:@"score"]; 
    [self setPrimitiveScore:score]; 
    [self didChangeValueForKey:@"score"]; 

    self.score_timestamp = [NSDate date]; 
} 

bu şekilde şeyler yapıyor herhangi uyarılar var mı? Yoksa bir KVO çözümü kullanmalı mıyım?

Güncelleme

Şimdiye kadar benim kod setValue: forKey: aracılığıyla işe yaramaz iki yanıtları aldık ve hala örneğin bekliyorum. Naif arama [(NSManagedObject *)myObject setValue:value forKey:@"score"], ayarlamamı tümüyle aynı şekilde çağırır.

KVO çözümüne geçersem, addObserver: tüm awake yöntemlerini kullanmalı ve willTurnIntoFault içinde kaldırabilir miyim? Yoksa bu kadar basit değil mi?

+0

Cidden, her iki yanıtlayıcıda setValue ... işe yaramayacağını belirten yanıtlar yanlıştır. Bunu erişimcinize bir kesme noktası koyarak ve daha sonra setValue kullanarak değeri değiştirerek kendinizi oldukça önemsiz bir şekilde test edebilirsiniz. – jrturton

+0

@jrturton Zaten test ettim, kesinlikle denir. Ancak, mülkümü erişimsiz olarak değiştirmenin başka bir yolu olup olmadığından emin olmak için Çekirdek Veri uzmanı değilim. Bazen gerçek kodda kullanılma yolunu kastediyorum. – iHunter

+0

Hayır. Tüm temel veri aramaları setçerinizden geçecektir (ilk önce setValueForKey üzerinden). Kapsülleme prensibinin bir parçası. İvan'a bazı garip doğrudan erişime sahip olabilirsiniz, ancak bu, muhtemelen sizin de yönetilen nesne bağlamını da kırabilecek, kendinizin yazdığınız bir şey olmalı. Bunu kendine yapmayacaksın değil mi? – jrturton

cevap

4

Sorunuzdaki uygulama gayet iyi. Değerinizi güncellemeye yönelik herhangi bir KVC girişimi de setter yönteminden geçer (setValue: forKey: sadece setKey ile eşleşen bir erişim yöntemi arar, ayrıntılar için bkz. here).

+2

"NSManagedObject -didChangeValue:" belgesinde "Bu yöntemi geçersiz kılmamalısınız" ifadesini görüyorum! – iHunter

+0

Bu mükemmel bir nokta! Daha iyi bir cevabı düşünürdüm ... – jrturton

+0

Cevabınızı düzenledim çünkü tehlikeli iken + 1'leri almaya başladı. Bana yardım etme çaban için teşekkür ederim, minnettarlığımı ifade etmek için diğer sorulara cevaplarınızdan bazılarını + 1'ledim (onlar da çok yardımcı oluyorlar :) – iHunter

0

Bu yöntemde, herhangi bir nedenle nesneyi özel alt sınıf olarak değil, setValue: forKey: kullanarak bir NSManagedObject olarak değiştirirseniz, tarih güncelleştirilmez.

+0

Lütfen bir örnek verebilir misiniz? – iHunter

1

Sen

[objectWithArray addObserver:self 
        forKeyPath:@"score" 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

Key-Value Observing Sonra gözlemlemek aradığınız:

-(void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    //Check if [change objectForKey:NSKeyValueChangeNewKey] is equal to "score" 
    //and update the score_timestamp appropriately 
} 

Sen getirme gelen uyanık olduğunda bildirim için kayıt ve arıza olduğunda kaydını gerektiğini, inanıyorum.

+0

Evet, KVO burada iyi bir çözüm, ancak mevcut kodumda bir sorun görmüyorum. Setterde başka bir özellik belirlemenin iyi bir fikir olmadığını sanıyorum, ama neden olduğunu bilmek istiyorum çünkü çalıştığını görüyorum :) – iHunter

+0

Kodunuzun yalnızca bu özellik için dinamik olarak oluşturulmuş alıcı/ayarlayıcıyı kullanacağını garanti ederseniz, Kod çalışmalıdır, ancak setValue: forKey'i kullanırsanız zaman damgası güncellenmez. –

+1

@iHunter - bir setterde başka bir mülkte yanlış bir şey yok. Başka bir kodda ayarlamak için farklı değil. _same_ özelliğini ayarlıyorsanız sorun yaşarsınız, ancak durum bu değil. – jrturton