![](/img/trans.png)
[英]NSNotification not receiving in View Controller from appDelegate
[英]NSNotification not received by sub level view controller
-編輯,請參閱下面的更新解決方案-
我在這里有一個應用程序,可以在后台線程中下載一些數據。
每次下載5個項目時,在主視圖控制器中,我都會發布一條通知,告知已下載5個項目。
在我自己的其他4個視圖控制器之一(它們本身是導航堆棧中的根視圖控制器)中,我鑽取到詳細信息頁面。 (典型的5個標簽欄界面)
此詳細信息頁面是另一個View Controller,其中我對viewDidLoad方法做了一個NSNotificationCenter defaultCenter addObserver。
這里的問題是,當通知被發布時,我的詳細信息頁面的根視圖控制器會收到通知,但詳細信息頁面本身不會收到通知。
盡管我的數據是在后台線程中下載的,但我正在使用調度方法調用performSelectorOnMainThread:。 在分派方法中,它調用[[NSNotificationCenter defaultCenter] postNotificationNamed:object:];
所以:
.... downloading batches of 5 items in a background thread ....
...
... downloaded calling [self performSelectorOnMainThread:@selector(foo) WithObject:nil WaitUntilDone:NO]; ...
...
// foo method
-(void)foo
{
// theoretically, this notification should be delivered and received in the main thread since this foo() method is told to execute on the main thread above
[[NSNotificationCenter defaultCenter] postNotificationName:@"notif_batchDownloaded" object:nil];
}
...
我在根視圖控制器中收到通知,但在我的詳細信息頁面中未收到通知。
1)當下載過程開始時,我已經在查看詳細信息頁面,所以不,我認為未釋放詳細信息頁面視圖控制器
2)詳細信息頁面視圖控制器顯然正在觀察主線程上的通知,並且如上所述,該通知被告知張貼在主線程上。
所以問題是,是否有其他原因會阻止子級別視圖控制器接收通知?
我認為我沒有超出任何通知觀察者限制。 我什至已注釋掉其他通知,但沒有區別。
每次下載5個項目時都會發送通知,因此在發送通知之前我無法查看詳細信息頁面。 即使我以某種方式錯過了前5名,我至少也應該收到2名,3名,5名,4名5等。
可能是根視圖控制器首先接收到通知,然后未能將通知傳遞給其子級別視圖控制器嗎?
我沒主意。
我終於找到了壞處。 真是皮塔餅。
在我以前的viewDidLoad方法中,它是這樣的:
-(void)viewDidLoad
{
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"notif_batchDownloaded" object:@"notif_batchDownloaded"];
...
}
這里的問題是我傳入的“對象”參數。我使用通知的名稱作為“對象”字段的參數,但這以某種方式導致我的doSomething()方法從不執行。
我刪除了對象參數,現在可以使用了。
新的viewDidLoad()應該像這樣:
-(void)viewDidLoad
{
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"notif_batchDownloaded" object:nil];
...
}
我本來以為我可以使用“對象”參數(如某種標記)來幫助我的回調方法識別在將多個通知發送到同一回調方法的情況下發送了哪個通知。
快速閱讀Apple文檔可以發現object參數用於標識觀察者從哪個對象觀察通知。 也就是說,多個對象可以發送相同的通知,此對象參數字段標識僅希望從哪個對象接收通知。
例如
View Controller A和View Controller B均為postNotificationName:@“ notif_foo”。
視圖控制器C將自身添加為通知“ notif_foo”的觀察者,但可以通過將視圖控制器A指定為對象參數來選擇僅從視圖控制器A接收“ notif_foo”。
愚蠢的我沒有意識到我可以去的通知回調方法:
if([notification name] isEqualToString:@"notifName"])
{
...
}
else
{
...
}
希望這對其他正在解決此問題的人有所幫助。
您可以在appdelegate中設置標志,以告訴您選擇了哪個控制器。 然后發布該控制器的通知。 請注意,在此處,您將需要在要發布通知的所有類中實現代碼,特別是在有ui更改或該類已發布的情況下
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.