gpt4 book ai didi

iphone - 子级 View Controller 未收到 NSNotification

转载 作者:行者123 更新时间:2023-11-28 17:33:51 25 4
gpt4 key购买 nike

-- 编辑,见下方更新解决方案--

我这里有一个应用程序,我可以在后台线程中下载一些数据。

每次下载 5 个项目时,在我的主视图 Controller 中,我都会发布一个通知,告知已下载 5 个项目。

在我的其他 4 个 View Controller 之一(它们本身是导航堆栈上的 Root View Controller )中,我深入到详细信息页面。 (典型的5标签栏界面)

这个详细信息页面是另一个 View Controller ,我在其中对 viewDidLoad 方法执行了 NSNotificationCenter defaultCenter addObserver。

这里的问题是,当通知发布时,我的详细信息页面的 Root View Controller 收到通知,但详细信息页面本身没有收到通知。

虽然我的数据是在后台线程中下载的,但我正在调用 performSelectorOnMainThread: 使用调度方法。在dispatch方法中调用[[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];
}

...

我在我的 Root View Controller 中收到通知,但在我的详细信息页面中没有。

1) 下载过程开始时,我已经在查看详细信息页面,所以不,我认为详细信息页面 View Controller 没有被释放

2) 详细信息页面 View Controller 显然在主线程上观察通知,如上所述,通知被告知要在主线程上发布。

所以问题是,是否还有其他原因阻止子级 View Controller 接收通知?

我认为我没有超出任何通知观察者限制。我什至注释掉了其他通知,但没有任何区别。

每次下载 5 个项目时都会发送通知,因此在发送通知之前我无法查看详细信息页面。即使我以某种方式错过了前 5 个,我至少应该收到第 2 个 5、第 3 个 5、第 4 个 5 等等。

会不会是 Root View Controller 先收到通知,然后未能将通知传递给它的子级 View Controller ?

我没有想法。

更新 - 找到了罪魁祸首!

我终于找到它坏的地方了。多么棒的 PITA。

在我之前的 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 文档会发现对象参数用于识别观察者从哪个对象观察通知。 IE。多个对象可以发送相同的通知,此对象参数字段标识它希望仅从哪个对象接收通知。

例如

View Controller A 和 View Controller B 都是 postNotificationName:@"notif_foo"。

View Controller C 将自己添加为通知“notif_foo”的观察者,但它可以选择通过将 View Controller A 指定为对象参数来选择仅从 View Controller A 接收“notif_foo”。

愚蠢的我在我的通知回调方法中没有意识到我可以去:

if([notification name] isEqualToString:@"notifName"])
{
...
}
else
{
...
}

希望这对其他正在解决这个问题的人有所帮助。

最佳答案

您可以在 appdelegate 中设置标志,以告知选择了哪个 Controller 。然后发布该 Controller 的通知。请注意,如果有 ui 更改或类已发布,您需要在所有要发布通知的类中实现代码

关于iphone - 子级 View Controller 未收到 NSNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10414637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com