9

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

该库管理它自己的队列,因此下载之类的事情显然不会在主线程上完成,但我的问题是我应该确保我的委托方法总是在主线程上调用,还是可以从队列线程中调用它们我正在使用?如果他想在我的委托方法中进行 UI 更新,并依赖使用该库的开发人员来检查他是否在主线程上?

干杯,山姆

4

3 回答 3

4

无论哪种方式,您都可以这样做;你只需要很好地记录这一点。

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

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

说了这么多,除非性能对您或您的 API 的用户至关重要,否则我会选择对开发人员最方便的主线程。

于 2013-07-05T10:53:20.470 回答
0

当我制作自己的下载管理器时,我一直在运行连接对象实例的辅助线程上调用委托方法,但这是因为我有一个“控制器”在主线程上调度成功块。在我看来,这取决于你的库涉及到哪个级别,如果你认为大多数时候委托会调用一个带有涉及 UIKit 对象的子例程的方法,因为它们不是线程安全的,我会选择在主线程上调度它们。如果您认为在委托之后您的图书馆的用户可以对数据进行进一步的阐述,我将选择留在另一个线程上,但在文档中清楚地说明这一点。还有一点:速度,取决于三个优先级,辅助线程可能真的很慢。
[编辑]
正如 Apple 工程师 Quinn 在 WWDC 视频中所说,在下载管理器中,KVO 或通知是处理连接的更好方法。

于 2013-07-05T11:10:31.080 回答
-2

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

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

于 2013-07-05T10:49:38.880 回答