- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在事件线程中有一个通知中心:
Poco::NotificationCentre nc; // publicly visible
// (thread main loop which will post notifications from time to time)
还有多个工作线程对通知进行操作。然而,那些等待通知的线程也可能需要在任何时候从外部发出退出信号。所以我在我的工作线程中得到了以下内容(同样,为了清楚起见,这是伪代码,省略了一些细节)
Poco::Event event;
std::string s;
MyNotificationClass notifier{event, s}; // holds those by reference
Poco::NObserver<MyNotificationClass, MyNotification> obs(notifier, &MyNoficationClass::func);
nc.addObserver(obs);
event.wait();
nc.removeObserver(obs);
return s;
通知类是:
struct MyNotificationClass
{
MyNotificationClass(Poco::Event &ev, std::string &s): ev(ev), s(s) {}
void func(const Poco::AutoPtr<MyNotification> &p)
{
s = p->s;
ev.set();
}
Poco::Event &ev;
std::string &s;
};
我担心的是,即使在工作线程中调用了 removeObserver
之后,通知中心也可能同时收到通知,所以对象 s
在工作线程刚从中返回
的函数中,在它被销毁后可能会被访问。
我的问题是:这是一个有效的问题吗?如果是,我应该怎么做才能确保在 return
之后不会发生通知?
最佳答案
编辑:因为removeObserver()
是disabling被移除的观察者,上面的代码是安全的。下面的答案留作记录以便理解评论部分。
原答案:
这是一个有效的问题 - 工作线程函数可以在 add/removeObserver() 调用之间被抢占。自 postNotification()
makes a copy * 在所有观察者的指针中,如果有来自其他线程的多个通知,在您调用 removeObserver()
(甚至函数返回后)。
现在,不必担心函数返回后会访问观察者,因为它是cloned。进入 SharedPtr由通知中心。但是,由于 NObserver 持有其 naked address,因此此时调用通知处理程序令人担忧。 .为了防止坏事发生,在从函数返回之前调用 obs.disable()
- 这将 disarm以线程安全的方式处理任何未决通知。
* 出于性能原因 - 我们不想在所有通知处理程序执行时阻塞 NotificationCenter 的其余部分。
关于c++ - Poco - 安全地使用 removeObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32195463/
简短版本: -removeObserver:forKeyPath:有什么用? ? 为什么不总是使用 -removeObserver:forKeyPath:context: ? 长版 在开发 Cocoa
我想添加一个 View Controller 作为通知的观察者。 调用选择器方法时,我会提醒用户。我希望只有当此 View Controller 是顶 View Controller 时才会出现此警报
我有一个 UITextView 子类,我在其中添加了一个 NSNotificationCenter 观察器。但是我在哪里再次删除观察者呢? 我的代码: _textDidChangeNotificati
该应用程序应仅加载本地发布的帖子。使用 GeoFire 在 FB 中有一个分支“posts_location”。我想先填充“nearbyPostsKeys”数组,然后从 FB 的分支帖子中加载那些引用
我有下一个代码: @implementation SplashViewVC - (void)viewDidLoad { [super viewDidLoad]; self.splash
以下是否删除了所有按名称添加的 NSNotificationCenter.defaultCenter View ? NotificationCenter.default.removeObserver(
我创建了一个观察器来跟踪AVPlayer的“速率”。每当AVPlayer速率按预期变化时,都会显示观察者通知。但是,当我尝试在AVPlayer正在播放的项目上结束播放时删除观察者时,出现以下崩溃: *
当我注释掉... // [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LoadRequestFromAppDel"
我有一个 View 可以像这样在 init 上观察自身的值: [self addObserver:self forKeyPath:@"focusPointOfInterestIndicator" op
我一直在观察一个值,直到用户注销。但是当我调用 self.ref.removeObserver(withHandle: self.handle) self.ref.removeAllObservers
我在事件线程中有一个通知中心: Poco::NotificationCentre nc; // publicly visible // (thread main loop which will p
通常我在 viewWillAppear 中添加我的观察者,并在 viewWillDisappear 中移除它们。在这种情况下,即使在 View 消失后,我也需要其中一名观察员继续,以便它可以完成一些工
这是我的观察事件代码: let databaseRef = FIRDatabase.database().reference() let query = databaseRef
-(void)viewDidAppear:(BOOL)animated { NSOperationQueue *mainQueue = [NSOperationQueue ma
基本上,我有一个 view1,它在某个时候调用 view2(通过 presentModalViewController:animated:)。当按下 view2 中的某个 UIButton 时,vie
众神将许多习惯空降到我与世隔绝的丛林村庄,例如: - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:s
我看过NSNotification addObserver/removeObserver 放在viewDidLoad/viewDidUnload , viewDidAppear/viewDidDisa
我遇到了从 NSNotificationCenter 中删除观察者的正确位置的问题 // DetailOfSomethingViewController @implementation DetailO
有各种与此主题相关的问题,但没有一个能回答我的问题。 我想在对象被释放时从对象中removeObserver。我正在使用 KVO,因为需要观察多个项目,而 NSNotification 在这种情况下会
我有一个带有按钮操作的 View Controller : @IBAction func MultiplayerButtonClick(sender: AnyObject) {
我是一名优秀的程序员,十分优秀!