如何确定 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 方法是不是是异步的?的主要内容,如果未能解决你的问题,请参考以下文章

刷新iOS应用收据:如何确定用户是不是需要登录应用商店?

使用 Apple 地图确定用户是不是在多边形区域之外

确定音频文件是不是以 Apple Lossless (ALAC) 编码

如何确定磁力计是不是需要校准 CoreMotion 参考系?

使用 FluentAssertions 和 NSubstitute 的异步单元测试是不确定的

如何确定 Google Maps Tiles 是不是已加载