我想知道与NSOperation
mainQueue
相关联的流程如何影响UITableView
的滚动。
我的代码中滚动缓慢的主要原因是每个单元格加载速度很慢,因为每个单元格都必须从服务器获取图像。 这就是为什么我曾经使用GCD创建另一个线程来处理每个单元格给出的提取过程。同时,主线程专门处理tableview的滚动,这是我所知道的确保快速滚动。
但是,最近几天,我注意到示例代码正在使用NSOperation
。
我模仿了部分,以便使用NSOperation
mainQueue
加载tableview单元格。
我预计它会对tableview的滚动性能产生负担,因为正如我所理解的那样,主线程处理单元格加载和tableview滚动。
但令人惊讶的是,事实并非如此。单元格加载和tableview滚动的性能都很完美。 我仍然想知道这是怎么回事。
我想我错了或者我错过了什么。 你能让我知道它是什么吗?
答案 0 :(得分:0)
iOS应用程序的主要线程包含两个元素:
•运行循环
•主要队列
主调度队列是全局可用的串行队列 在应用程序的主线程上执行任务。此队列适用于 应用程序的运行循环(如果存在)到交错 执行其他事件源执行排队任务 附加到运行循环。因为它在您的应用程序的主要运行 线程,主队列通常用作密钥同步点 申请。
您的View Controllers中的代码在运行循环上运行(不确定此代码)。这就是为什么你不被允许执行任何持久的任务。
您可以将这些任务委派给主队列(这就是您正在做的事情)。当你这样做时,操作系统交错运行循环和主队列之间的执行(加载图像)。这就是为什么滚动视图仍然很顺利。
为什么我们不在主队列上执行所有异步任务呢?你可能会问。因为主队列必须与运行循环共享线程处理器时间,所以操作将比后台线程执行得慢。但是,在这个例子中,你不能看到它。
答案 1 :(得分:0)
所有iOS UI动画(包括滚动)都在单独的UI线程上执行。因此,只要UITableView
具有所有必需的数据(即,在图像加载之前提供空单元格),它就不会被任何类型的主线程活动阻止。
动画的执行发生在辅助线程上 避免阻塞当前线程或应用程序的主线程。