如何确定 Apple 方法是不是是异步的?
Posted
技术标签:
【中文标题】如何确定 Apple 方法是不是是异步的?【英文标题】:How can I determine if Apple methods are asynchronous?如何确定 Apple 方法是否是异步的? 【发布时间】:2014-05-21 04:11:01 【问题描述】:我正在使用 mainQueueConcurrency 将 NSArrayController 绑定到 managedObjectContext。
我要做的就是用我自己的函数修改排列对象的排序属性,然后调用rearrangeObjects
,然后选择一些对象。
但看起来rearrangeObjects
没有同步执行。
那么我怎样才能证明这一点,一种或另一种方式?
这行得通:
[self.myArrayController rearrangeObjects];
// Async needed -- I believe rearrange calls a fetch, which is async
dispatch_async(dispatch_get_main_queue(), ^
[self.myArrayController setSelectedObjects:anArray];
);
减去dispatch_async
,它不起作用。选择不会发生。
我相当确信,就像 NSArrayController 上的 fetch
一样,** 那么我该如何证明呢?我可以在那里设置断点并检查数组控制器等。我有,我怀疑这就是正在发生的事情。rearrangeObjects
会在下一次 runloop 迭代中自行调度。
但是是否有一些调试技巧可以使“尤里卡!这行代码启动异步操作”变得明显??
** 异步执行某些操作的是可可绑定。当然。 rerangeObjects 只是触发它。
【问题讨论】:
我对 NSWindowController 的showWindow
也有类似的担忧
只是一个想法...添加数组的日志行并在其上设置断点(在调用重新排列之后),在rearrangeObjects
调用上设置断点,得到一个未排序的数组,运行应用程序直到它到达重新排列调用,跳过它,暂停主线程,恢复应用程序执行(主线程暂停),然后暂停应用程序并恢复主线程执行,到达日志行并打印大批。排序了吗?如果是,则重新排列发生在另一个线程上。
谢谢——我没有意识到你可以通过线程暂停,我做了一些实验。但我怀疑这一切都在主线程调度队列中......
【参考方案1】:
通过在可疑代码行之前中断并在 GCD dispatch_async 函数上启用 符号断点,我能够捕获 rearrangeObjects
调用 dispatch_async_f
(通过绑定):
而且,果然,dispatch_async_f
符号断点停在rearrangeObjects
行:
【讨论】:
通过使用符号断点,我学到了很多关于框架实际在做什么的知识。 顺便说一句,你可以在几天内接受你自己的答案。 @matt -- 这对我来说是个新技巧!今天早上睡了这个并谷歌搜索后找到了它。但我确实认为,“哇,这将是非常有用的。” 但它是在主线程以外的线程上调用的,还是只是安排在以后在主线程上执行? @DanShelly,我不确定。我想知道绑定实现是否在 MOC 上使用perform_block
.. 这是 mainQueue,但它在我的后续代码之后运行。不管线程是什么,在我的代码之后都会运行一些东西。以上是关于如何确定 Apple 方法是不是是异步的?的主要内容,如果未能解决你的问题,请参考以下文章
确定音频文件是不是以 Apple Lossless (ALAC) 编码
如何确定磁力计是不是需要校准 CoreMotion 参考系?