簡體   English   中英

NSNotificationCenter 將所有實例添加為觀察者

[英]NSNotificationCenter adds all instances as observer

所以我有一個類,它在初始化時將自己添加為 NSNotificationService 中的觀察者,並且在 dealloc 上從 NSNotificationCenter 中刪除自己。

一切正常,我發布通知並收到一次並使用正確的對象。

然后我做了一個循環並添加了三個視圖。 每個視圖都被稱為 init 一次,所有視圖都將自己添加為觀察者。

現在,當我發布通知時,每個視圖都會收到三次通知! (共9個)

所以我將我的添加觀察者移動到另一種方法,並只在兩個視圖(來自這三個視圖)上調用它。

現在每個視圖都被調用了兩次(三個視圖被調用了兩次,總共 6 個),盡管第三個實例甚至沒有被添加為觀察者(觀看了metgod,沒有按預期被調用)。

現在我刪除了循環並創建了三個視圖。 並且只添加了一個作為觀察者。 三個人都被叫...

這是已知問題還是我發現了一些新問題?

Xcode 4.6 iOS 6.1

更新 - - - - - - - -

問題是,我的 View 實際上只是一個實例。

此代碼生成三個視圖,它們都是相同的一個視圖。

CustomViewController * hw1 = [[CustomViewController alloc] init];

    [hw1 setupWithFrame:CGRectMake(
                                contentScrollView.frame.size.width * 0 + contentScrollView.frame.size.width/2 - 250 ,
                                contentScrollView.frame.size.height / 2 - 250,500,500)];

    [contentScrollView addSubview:hw1.view];

CustomViewController * hw2 = [[CustomViewController alloc] init];

[hw2 setupWithFrame:CGRectMake(
                               contentScrollView.frame.size.width * 1 + contentScrollView.frame.size.width/2 - 250 ,
                               contentScrollView.frame.size.height / 2 - 250,500,500)];

[contentScrollView addSubview:hw2.view];

CustomViewController * hw3 = [[CustomViewController alloc] init];

[hw3 setupWithFrame:CGRectMake(
                               contentScrollView.frame.size.width * 2 + contentScrollView.frame.size.width/2 - 250 ,
                               contentScrollView.frame.size.height / 2 - 250,500,500)];

[contentScrollView addSubview:hw3.view];

更改 hw1 中的內容,更改 hw2 和 hw3 中的內容。

SetupWithFrame 只是一種分配和添加定義框架的子視圖的方法。

在添加觀察者之前每次都刪除您的觀察者。 它顯然被多次添加

這是您的問題根源:

您在循環中創建了hw1hw2hw3三個實例,並將它們添加到[contentScrollView addSubview:

所以你的 contentScrollView 現在總共有九個子視圖,每個子視圖都有自己的觀察者。

這就是為什么您的通知會被觀察九次。

循環在這里:

當我創建一個視圖 A 並將其設置為觀察來自 Data 的調用時,A 告訴 Data 進行更新。

現在視圖 B 也被設置為觀察者並告訴數據更新。

最后,Data 被告知要更新 3 次,並且因為它更新了它告訴所有觀察者有關新數據的信息(3 次)並且所有視圖都以相同的方式(畢竟不是同一個實例)因為它們接收到用於其他視圖的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM