2010-06-18 11 views
22

Bu, başkalarına bir süre onları kaydetmek için bir uyarı kadar bir soru değildir.Yinelenen NSNotification gözlemleri hakkında iOS/iPhone kullanıcılarının uyarısı

NSNotificationCenter iOS'ta 3/iPhone OS 3 (Ben de iOS 4 Mac OS X ve varsayarak) aşağıdaki davranışı vardır:

Eğer tam belirli bildirim için kendinize defalarca, NSNotificationCenter olacak DEĞİL kayıt varsa, fazlalığı tanımakta ve bunun yerine bir gözlem kaydettiğinizde size birçok bildirim gönderecektir.

Bu neredeyse görmek istediğiniz davranış değildir ve neredeyse her zaman rastlantısaldır.

Örnek:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

ama daha önce zaten viewWillAppear aynı şeyi koyardım: Ben yeni veri geldiğinde benim bakış denetleyici bir tekil ağ nesneden bildirimlerini almak istediğiniz

aynı gözlemciye çözme, tam aynı bildirim olduğunu
- (void) viewWillAppear 
{ 
    [super viewWillAppear]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

Not , gönderici ve bildirim adı.

Bu durumda, bu addObserver çağrılarından birini kaldırmazsam, görüntü denetleyicime iki kez bildirim gönderirim.

Çok iş parçacıklı bir ortamda, bu bir acı dünyasıdır. Güven Bana.

Böyle bir şeye karışan başkalarının olması durumunda bunu dışarıda bırakmak.

+1

1 İyi bir uyarıya sahip olmak için iyi bir uyarıya sahip olmalısınız - bunun büyük bir kısmını bir cevap olarak vermelisiniz ve kabul etmelisiniz :) (Alex Trebek'in 'cevabınızı ifade etmeli' ile ilgili bir şeyler mırıldandığını söyleyin…) –

+0

Yeterince uzun sürdü, ama bitti. –

cevap

4

NSNotificationCenter iOS'ta 3/iPhone OS 3 (Ben de iOS 4 Mac OS X ve varsayarak) aşağıdaki davranışı vardır:

Eğer tam belirli bildirim için kendinize defalarca, NSNotificationCenter olacak DEĞİL kayıt varsa, fazlalığı tanımakta ve bunun yerine bir gözlem kaydettiğinizde size birçok bildirim gönderecektir.

Bu neredeyse görmek istediğiniz davranış değildir ve neredeyse her zaman rastlantısaldır.

Örnek:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

ama daha önce zaten viewWillAppear aynı şeyi koyardım: Ben yeni veri geldiğinde benim bakış denetleyici bir tekil ağ nesneden bildirimlerini almak istediğiniz

aynı gözlemciye çözme, tam aynı bildirim olduğunu
- (void) viewWillAppear 
{ 
    [super viewWillAppear]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

Not , gönderici ve bildirim adı.

Bu durumda, bu addObserver çağrılarından birini kaldırmazsam, görüntü denetleyicime iki kez bildirim gönderirim.

Çok iş parçacıklı bir ortamda, bu bir acı dünyasıdır. Güven Bana.

Böyle bir şeye karışan başkalarının olması durumunda bunu dışarıda bırakmak.

+0

'da bile artık çağrılmamaktadır Bu bir kodlayıcı hatasıdır, bir kitaplık hatası değil. Sadece almak istediğiniz bildirimleri kaydedin. Aynı bildirimde birden çok kez neden aynı nesneye kayıt olacağınızdan emin değilim. – chadbag

+0

Bu benim amacımdı. Eğer bir gözlemci vardır ve diğer bazı görünüm kontrolörleri bu temel sınıfını genişleten bir taban görünümü denetleyicisi var durumlarda –

+0

ardından gözlemci eklemek için kod viewDidLoad veya viewDidAppear olmanın gözlemci önlemek için bir yol gibi görünüm yaşam döngüsü yöntemlerinde ise Gönderim Tablosuna eklenen, gözlemciyi kaldırarak ve bunu ekleyerek yüklendi. Bu sayede gözlemci defalarca eklenmeyecek. –

0

Kendiniz söylediğiniz gibi, NSNotificationCenter, bazılarının can sıkıcı olabileceği, ancak bunun arkasındaki tüm sistemin göz önünde bulundurulduğunda mantıklı olabilecek, yinelenmeler için bir denetim yapmaz.

Aynı mantık, belirli nesnelere hedefler eklemek için de geçerlidir, ancak çoğunlukla bunlar üzerinde önemli bir tanıma vardır.

fikir için teşekkür eder, iyi bir SEO dostu uyarı :)

+0

Onun arkasında tam sistem düşünün, bu mantıklı? Daha fazla ayrıntı söyler misiniz lütfen? Teşekkürler. –

2

için Sen ve her zaman gözlemci temizlemek gerekir.
Bunu yapmanın en kolay yolu şudur: [[NSNotificationCenter defaultCenter] removeObserver: self]
viewDidLoad, gözlemciler eklemek için iyi bir yer değildir, çünkü bu işlevler birden çok kez çağrılabilir çünkü bu, viewDidUnload tetiklendiğinde olur. AddOverervers'ınızı viewWillAppear'a yerleştirmek ve viewWillDisappear'dakiObservers'ı kaldırmak için iyi bir yer.

+0

ayrıca, viewDidUnload artık kullanılmamaktadır ve iOS 6 –