如何使用NSOperation mainqueue使UITableView的滚动顺畅?

时间:2016-04-06 13:32:42

标签: ios objective-c uitableview grand-central-dispatch nsoperation

我想知道与NSOperation mainQueue相关联的流程如何影响UITableView的滚动。

我的代码中滚动缓慢的主要原因是每个单元格加载速度很慢,因为每个单元格都必须从服务器获取图像。 这就是为什么我曾经使用GCD创建另一个线程来处理每个单元格给出的提取过程。同时,主线程专门处理tableview的滚动,这是我所知道的确保快速滚动。

但是,最近几天,我注意到示例代码正在使用NSOperation。 我模仿了部分,以便使用NSOperation mainQueue加载tableview单元格。 我预计它会对tableview的滚动性能产生负担,因为正如我所理解的那样,主线程处理单元格加载和tableview滚动。

但令人惊讶的是,事实并非如此。单元格加载和tableview滚动的性能都很完美。 我仍然想知道这是怎么回事。

我想我错了或者我错过了什么。 你能让我知道它是什么吗?

2 个答案:

答案 0 :(得分:0)

iOS应用程序的主要线程包含两个元素:

•运行循环

•主要队列

  

主调度队列是全局可用的串行队列   在应用程序的主线程上执行任务。此队列适用于   应用程序的运行循环(如果存在)到交错   执行其他事件源执行排队任务   附加到运行循环。因为它在您的应用程序的主要运行   线程,主队列通常用作密钥同步点   申请。

Source

您的View Controllers中的代码在运行循环上运行(不确定此代码)。这就是为什么你不被允许执行任何持久的任务。

您可以将这些任务委派给主队列(这就是您正在做的事情)。当你这样做时,操作系统交错运行循环和主队列之间的执行(加载图像)。这就是为什么滚动视图仍然很顺利。

为什么我们不在主队列上执行所有异步任务呢?你可能会问。因为主队列必须与运行循环共享线程处理器时间,所以操作将比后台线程执行得慢。但是,在这个例子中,你不能看到它。

答案 1 :(得分:0)

所有iOS UI动画(包括滚动)都在单独的UI线程上执行。因此,只要UITableView具有所有必需的数据(即,在图像加载之前提供空单元格),它就不会被任何类型的主线程活动阻止。

  

动画的执行发生在辅助线程上   避免阻塞当前线程或应用程序的主线程。

https://developer.apple.com/.../AnimatingViews.html