2008-10-03 15 views
13

'da gözlemci/gözlemlenebilirliğin en iyi yolu nedir? Java Swing UI'leri kodlamak için kullanıyorum ve değiştiren bazı özellikleriniz varsa ve kullanıcı arayüzünüzün güncellenmesini istiyorsanız, Gözlemci/gözlemlenebilir modeli uygular. Java'da bunu normal olarak, sınıfınızın farklı olaylardan haberdar ettiği bir dinleyici listesi tutmasını sağlayarak gerçekleştirirsiniz.Objektif-c (iphone sürümü)

Mac'te Objective-C ile çalıştım ve KVC ve bağlayıcı çok güzel çalışıyor ve daha az kod gerektiriyor. IPhone SDK bu işlevselliğe sahip gibi görünmüyor, bu yüzden sorum şu: Değişen verileri tutan bir sınıfım varsa, bu sınıfla birlikte bir UI bileşenini kaydetmem için en iyi yol nedir? Verilerinde görüntülenmesi gereken değişiklikler var mı?

cevap

37

Kakao'da gözlem yapmanın iki yerleşik yolu vardır: Temel Değer Gözlemleme ve bildirimler. Her iki sistemde de, bir gözlemci koleksiyonunu kendiniz muhafaza etmeniz veya bildirmeniz gerekir; çerçeve sizin için halledecektir.

Anahtar-Değer Gözlemleme (KVO), bir nesneyi (bir koleksiyonu temsil eden bir özellik de dahil) gözlemlemenizi ve bu özellikteki değişikliklerden haberdar edilmenizi sağlar. Güncellemeleri almak istediğiniz nesneyi iletmek için -addObserver:forKeyPath:options:context: nesnesini, güncellemeleri almak istediğiniz özelliğin (alıcıya göre) anahtar yolunu ve almak istediğiniz güncelleme türlerini göndermeniz yeterlidir. (Bir koleksiyonu temsil eden bir özelliği gözlemlemek isterseniz, kullanabileceğiniz benzer yöntemler vardır.)

Bildirimler daha eski ve daha ağırdır. Bir olay meydana geldiğinde bir bildirim iletilecek bir nesne ve seçici çifti olan bir NSNotificationCenter - genellikle varsayılan merkeze - kayıt olursunuz. Bildirim nesnesinin kendisi userInfo özelliği aracılığıyla rastgele veriler içerebilir ve belirli bir nesneye uygulananlar yerine belirli bir adla ilgili tüm bildirimleri gözlemlemeyi seçebilirsiniz.

Belirli bir durumda hangisini kullanmalısınız? Genel olarak, belirli bir nesnenin belirli bir özellikteki değişikliklerini önemsiyorsanız, Anahtar-Değer Gözlemini kullanın. Bunun için tasarlandığı ve kasıtlı olarak hafif olduğu. (Diğer kullanımların yanı sıra, Kakao Bağlamalarının oluşturulduğu temeldir.) Bir mülk tarafından temsil edilmeyen bir durumla ilgileniyorsanız, bildirimler daha uygundur. Örneğin kullanıcı model nesnesinin adını değiştirdiğinde senkronizasyonda kalmak için KVO kullanırdım. Tüm bir nesne grafiğinin ne zaman kaydedildiğini bilmek için bildirimleri kullanırdım.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleWhateverChange) name:@"whateverChange" object:nil]; 

değişim olaylar için kayıt olmak ve

[[NSNotificationCenter defaultCenter] postNotificationName:@"whateverChange" object:nil]; 

onları ateş için:

+4

Harika cevap - KVO yaklaşımıyla, birçok nesneye kayıtlı bir gözlemciyi nasıl kaldırırsınız? KVO'nun başlık altında bildirimleri kullandığını düşündüm (ama). Ama sanmıyorum. Böylece addObserver: X forKeyPath kullandıktan sonra: ..., daha sonra yapmaya çalışırsanız: [[NSNotificationCenter defaultCenter] removeObserver: X] Bu işe yaramıyor? X'in gözlemlediği tüm nesnelerin ayrı bir listesini tutmanız gerektiği anlamına gelir, böylece gözlemi kaldırabilirsiniz. Yoksa bir şey mi özlüyorum? – TimM

+0

@TimM: Gözlenen nesne için uygun yöntemi çağırırsınız. Örneğin: '[self removeObserver: theObserver forKeyPath: @" someProperty "];' – FreeAsInBeer

+0

OS X 10.7'deki yeni Lion ve iOS 5.0, bir metod var: -KapalıObserver: forKeyPath: bağlam: ne zaman geçtiğinizde aynı bağlamı geçebilirsiniz gözlemciyi ekliyor. Mümkün olduğunda, çoklu nesnelerin aynı anahtar yolu gözlemlemesi durumunda bunu yapmalısınız. –

0

Bu, genellikle bu şekilde yapılma şekli değildir. Özellikle Apple dokümantasyonunun bağlantısı olan here numaralı tartışmaya göz atın.

Yine de, bunu yaptığınız gibi yapmak istiyorsanız, "elle" bağlama gibi bir şey uygulamak özellikle zor değildir. Değişikliklere nasıl abone olacağınızı bilen ve bir görüntünün özelliklerine bağlanan bir "bağlayıcı" nesne oluşturursunuz.

Gerçekte nasıl yapıldığını yanıtlamak için - normalde, modelin durumunu izleyen (bir Gözlemci gibi davranan) denetleyici nesnesi vardır ve görüntüleme nesnesini/nesneleri gereken şekilde güncelleştirir.

+0

Sadece en iyi yolun nasıl olduğunu soruyorum ve bir JAVA örneği vereceğim. Objektif-C yolu tamamen farklıysa, özellikle endişelenmiyorum, sadece ne olduğunu bilmek istiyorum. – rustyshelf

+0

Anladım. Ne hakkında konuştuğumu netleştirmek için cevabımı düzenledim. –

9

Ben de bunu yapabilirsiniz bulundu.Ben bir N00b olabilirim ama benim için çalışacak anahtar yol için gözlemciyi alamadım.