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