主线程上的 NSOperation 和 NSNotificationCenter
我有一个 NSOperation。完成后,我触发 NSNotificationCenter 让程序知道 NS 操作已完成并更新 gui。
据我了解, NSNotification 的侦听器不会在主线程上运行,因为 NSOperation 不在主线程上。
当我触发事件时,如何才能使侦听器在主线程上运行?
[[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self];
I have an NSOperation. When it is finished I fire a NSNotificationCenter to let the program know that the NSoperation is finished and to update the gui.
To my understanding listeners to the NSNotification will not run on the main thread because the NSOperation is not on the main thread.
How can I make it so that the listeners run on the main thread when I fire my event?
[[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self];
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
更新:
调度队列使得在主线程上发布通知变得非常容易。
要等待通知处理程序完成,只需将dispatch_async替换为dispatch_sync即可。
根据 notnoop 的回答,这里有一些基础设施,您可以使用它们在主线程上安全地发布通知,而无需等待它们完成。希望有人会觉得这有帮助!
NSNotificationCenter+Utils.h:
NSNotificationCenter+Utils.m:
NSInitation+Utils.h:
NSInitation+Utils.m:
Update:
Dispatch queues make posting a notification on the main thread very easy.
To wait for the notification handlers to finish, just replace dispatch_async with dispatch_sync.
Following notnoop's answer, here's some infrastructure you can use to safely post your notifications on the main thread without waiting for them to finish. Hopefully someone will find this helpful!
NSNotificationCenter+Utils.h:
NSNotificationCenter+Utils.m:
NSInvocation+Utils.h:
NSInvocation+Utils.m:
您可以使用
performSelectorOnMainThread:withObject:waitUntilDone:
使用辅助方法,其方式与以下示例类似。如果您不等到完成,则需要考虑其他线程可能引用在调用主线程之前可能已经清理的对象的情况。
You can use
performSelectorOnMainThread:withObject:waitUntilDone:
with using a helper method, in a similar fashion to the following example.If you don't wait until being done, you will need to consider the cases where other threads may refer to the object which could be already cleaned up before the main thread gets invoked.
如果您使用的是 10.6,您还可以使用 setCompletionBlock:。
它的用法如下:
对于块和 GCD 的一般介绍,这篇文章非常有帮助。我找到了GCD & setCompletionBlock 比 NSNotification 更容易阅读。需要注意的是,它只能在 10.6 上运行!
If you're on 10.6, you can also use setCompletionBlock:.
It's used like this:
For general introduction on blocks and GCD, this article was extremely helpful. I found GCD & setCompletionBlock easier to read than NSNotification. One caveat is, well, it only runs on 10.6!
为了扩展 Danra 的答案,这里是我整理的该类别的 ARC 兼容版本:
NSNotificationCenter+Threads.h
NSNotificationCenter+Threads.m
To expand on Danra's answer here's the ARC compliant version of the category I put together:
NSNotificationCenter+Threads.h
NSNotificationCenter+Threads.m