2009-07-09 16 views
19

Bir NSMutableDictionary içinde farklı anahtarlar altında depolanan değerlerde değişiklik (abonelik) gözlemlemek mümkün mü? Benim durumumda, abonelik başlatıldığında anahtarlar zaten mevcuttu, ancak değerler değişti ve bu durumda bilgilendirilmek istiyorum. Bildirimde değiştirilen değerin anahtarını istiyorum.Gözlemleme NSMutableDictionary değişiklikleri

Sözlük anahtarlarımın tümü NSString örneğiyse, her anahtar yoluna tek tek abone olabileceğimi varsayalım. Ama ya anahtarlarım dizgiler değilse? Bu davada şanstan mu uzaktayım?

cevap

6

Bu ilginç bir fikir. NSDictionary veya NSDictionaryController'da umut verici görünen hiçbir şey bulamıyorum. İlk içgüdüm, bir NSMutableDictionary etrafındaki kompozisyonu kullanmak ve setObject: forKey: (ve belki de -removeObjectForKey :) çağrılarını arayarak değişikliklerin abonelerini bilgilendirmek olacaktır.

NSMutableDictionary alt sınıfında bir Cocoa With Love post var, bu rotaya gitmeyi seçmeniz yararlı olacaktır. Ayrıca created my own NSMutableDictionary subclasses var ve açık kaynak kodunu kullanmak için bekliyoruz.

İzlenmesi gereken belirli anahtarları belirleyebilen bir gözlemci protokolü tasarlayabilirsiniz. Çok fazla kod olmamalı, ama şu anda atmak için zamanım var.

+0

Teşekkürler. Bir NSMutableDictionary etrafında kompozisyonun gitmenin yolu olduğunu düşünüyorum. Anahtarlar NSStrings olmadıkça bu işi nasıl yapacağımı hala göremiyorum, ama muhtemelen bununla çalışabileceğimi düşünüyorum. –

+0

@Quinn Taylor: Özel alt sınıfınızın bağlantısı ölü gibi görünüyor ve bu kodu kontrol etmem gerekiyor. Hala bir yerlerde asılı duruyor musun? – Cyrille

6

NSMutableDictionary çevresindeki kompozisyonu kullanarak bunu şimdi başarıyla uyguladım. Ne kadar küçük bir kod aldığına şaşırdım. Uyguladığım sınıf, bir tahta oyunundaki modeli temsil etmek için kullanılan bir tahtadır. Herkes addObserver arayarak kurulu devletler için değişikliklerine abone olabilir: yöntemini şöyle uygulanan: Yalnızca KVO modeliyle tuşları abone olabilir, ben aldattım

- (void)addObserver:(id)observer { 
    for (id key in grid) 
     [self addObserver:observer 
       forKeyPath:[key description] 
        options:0 
        context:key]; 
} 

ve anahtarın açıklaması abone ancak anahtarın kendisini bağlam olarak geçmesi. Kartımın örneklerini gözlemleyen nesnelerde, keyPath dizesini yok saymak için -observeValueForKeyPath:ofObject:change:context: uygular ve yalnızca gönderilen içeriği kullanır.

Benim basit Kurulu dersiniz bu yöntemi kullanarak oluşturduğunuz yapay özellikleri için KVO uyumlu olmadığı, bu nedenle KVO makine bu tuşların eski/yeni değerler elde etmeye çalışmak olmaz bu yüzden options özelliğinde 0 geçti. Bu benim kodumun patlamasına neden olur.

- (void)setPiece:(id)piece atLocation:(Location*)loc { 
    [self willChangeValueForKey:[loc description]]; 
    [grid setObject:piece forKey:loc]; 
    [self didChangeValueForKey:[loc description]]; 
} 

Voila: tahta değiştirir

şey harekete sıçrama KVO makine neden gerekli bildirimleri yükseltmek (benim basit sınıfta bu tek kişi yöntem vardır)! Dize olmayan anahtarlarla bir NSMutableDictionary aboneliği!

+0

Açıklamaya abone olmak güzel bir hile! –

İlgili konular