0

我一直在网上搜索这个问题的答案,但无法找到答案,另一方面,我认为这很常见,因此我可能在这里遗漏了一些关键字。无论如何,问题如下:

什么时候控制 ObjC (iPhone) 中的回调函数?

在将控制权交给负责运行循环的层次结构类中的高层之后是否会发生这种情况?它可以发生在正在执行的另一个函数调用的中间吗?

以NSURLConnection为例,我们不知道或无法预测它何时会调用didReceiveResponse或其他回调方法,会不会是当我在另一个函数中间时调用didReceiveResponse get 的情况? (高度怀疑,但无法找到有关等待运行循环结束的回调的信息)

干杯,卡斯帕

4

4 回答 4

4

当我在另一个函数的中间时,didReceiveResponse 会被调用吗?

不,在单个线程中,代码不是并行执行的。runloop 调度所有消息的执行并按顺序分派它们。甚至 NSTimers 也不能保证触发到理论上能够达到的精度,因为它们必须像其他所有东西一样等待运行循环。

于 2009-12-05T16:08:44.683 回答
1

实际上,不会在您的函数中间调用回调。您必须将控制权交还给主运行循环,以便它处理事件并调用您的回调。

如果你想知道究竟是谁调用了你的回调,请在其中放置一个断点,然后检查堆栈跟踪。

于 2009-12-05T15:49:57.790 回答
0

在执行其他操作时调用 didReceiveReponse 的唯一时间是,如果您已经在它自己的线程上启动了连接(通常在 NSOperation 中)。

这就是为什么当您在后台线程中确实有连接时,您通常使用类似 performSelectorInMainThread 之类的东西来更改应用程序其他部分的值 - 尽管如果它们没有标记为非原子并且不是可变集合,您可以直接调整属性。

于 2009-12-05T23:43:59.407 回答
0

默认情况下,基本上所有的 cocoa touch 类都完全在一个线程中工作,包括许多异步操作,如后台网络调用。主要的例外是 NSOperation 和朋友,以及与 NSThread 相关的东西。

操作系统可以通过在运行循环调度中插入其回调来做到这一点。在某些情况下,您的一个调用也会导致同一堆栈上的回调 - 例如,如果您在一个对象上调用 resignFirstResponder,该对象会在发生这种情况时通知其委托,例如 UITextField。

一些相关的博客文章:

于 2010-04-07T05:40:39.287 回答