我的iOS委托方法是否总是在主线程上返回?

时间:2013-07-05 10:30:30

标签: ios delegates queue grand-central-dispatch

这是一个“最佳实践”问题,我似乎无法在网上找到一个好的答案。我正在创建一个静态代码库,它提供了几种委托方法,用于进行反馈等。

库管理它自己的队列,所以下载的内容显然没有在主线程上完成,但我的问题是我应该确保我的委托方法总是在主线程上调用,或者可以接受从主线程调用它们我使用的排队线程?如果他想在我的委托方法中进行UI更新,那么依赖于使用该库来检查他是否在主线程上的开发人员?

干杯, 萨姆

3 个答案:

答案 0 :(得分:4)

你可以这样做;你只需要记录好这一点。

有些API会在主线程上回调您,有些API会在您用于启动工作的线程(或runloop)上回调,而其他API则根本不做任何保证。有些甚至会让你传入一个用于所有回调的GCD队列。

请记住,委托/回调可能会阻塞非常重要的时间,因此如果您的API需要尽快恢复工作,您当然希望调度到另一个线程或队列。

说完这一切之后,除非性能对您或API的用户至关重要,否则我会为开发人员提供最方便的主线程。

答案 1 :(得分:0)

当我创建自己的下载管理器时,我保持委托方法调用正在运行连接对象实例的辅助线程,但这是因为我有一个“控制器”,它在主线程上调度成功块。在我看来,取决于你的库所涉及的级别,如果你认为委托会调用一个包含UIKit对象的子程序的方法,因为它们不是线程安全的,我会选择在主线程上调度它们。如果您认为在委托之后,您的库的用户可以进一步详细说明数据,我将选择留在另一个线程,但在文档上明确说明。还有一点:速度,根据三个优先级,次要线程可能非常慢 [编辑]
在下载管理器中,KVO或通知是处理连接的更好方式,如Quinn和Apple工程师在WWDC视频中所述。

答案 2 :(得分:-1)

显然你必须在主线程中调用委托方法,因为如果我没有错,你的委托方法将被传递给某个委托对象(用户的类)。

假设您正在下载队列中的数据,当下载数据时,您将通过将其传递给用户类的某个对象来调用委托方法,因此它必须位于主线程中。