gpt4 book ai didi

ios - NSNotification 不在另一个类中工作

转载 作者:行者123 更新时间:2023-11-28 19:07:38 25 4
gpt4 key购买 nike

我正在开发的应用程序的一部分涉及在用户变得不活跃时在当前内容上放置一个空白屏幕。因此在 x 秒后打开一个空白页面 View Controller :

(来自 ViewController.m 并通过检测来自 ScreenBlank.m 的 NSNotification 触发)

UIPageViewController *blankPage = [self.storyboard instantiateViewControllerWithIdentifier:@"BlankPageViewController"];
[self presentViewController:blankPage animated:YES completion:nil];

当用户触摸屏幕(从而确认他们的事件)时,这个空白屏幕就会被移除,如下所示:

(来自 ViewController.m 的 touchesBegan 回调内部)

[self dismissViewControllerAnimated:YES completion:nil];

我遇到的问题是,我现在想在其他地方触发删除此屏幕空白,例如当用户注销时。这是通过从插入的读卡器中取出一张卡来完成的,这意味着它是从一个单独的类调用的(并且是从 ActionMgr.m 中实例化的类)。

有问题的类 (CardWatcher) 是这样创建的:

CardWatcher *newInstance = [[CardWatcher alloc] init];
[newInstance StartCardChecker];

当卡片被移除时,CardWatcher 实例会发出通知,如下所示:

[[NSNotificationCenter defaultCenter] postNotificationName:@"logout" object:nil];

然后在 ViewController 中监听此通知,并在触发时执行与之前用于清空屏幕的代码完全相同的代码:

[self dismissViewControllerAnimated:YES completion:nil];

通过使用日志记录,我确定通知接收正常,并且正在执行 dismissViewControllerAnimated 代码,但由于某种原因,上述代码实际上并未关闭 View Controller 。

我能想到的唯一原因是,它(从长远来看)在一个类的实例中被称为 form,但即使这样它也是通过 NSNotification 传递的,所以在我看来它的来源应该是无关紧要的?

如有任何帮助,我们将不胜感激!

最佳答案

听起来通知不是在主线程上生成的,因此您正试图从辅助线程中关闭该页面。确保您在主线程而不是辅助线程上发布通知。当通知触发 UI 事件时,例如这个事件,操作 UI 的代码需要在主线程上执行。

Delivering Notifications To Particular Threads

Regular notification centers deliver notifications on the thread inwhich the notification was posted. Distributed notification centersdeliver notifications on the main thread. At times, you may requirenotifications to be delivered on a particular thread that isdetermined by you instead of the notification center. For example, ifan object running in a background thread is listening fornotifications from the user interface, such as a window closing, youwould like to receive the notifications in the background threadinstead of the main thread. In these cases, you must capture thenotifications as they are delivered on the default thread and redirectthem to the appropriate thread.

只需尝试以下代码,让我知道它是否适合您。

 dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"logout" object:nil];
});

关于ios - NSNotification 不在另一个类中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18911674/

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