0

我不知道如何与NSOperationmainQueue相关的过程不会影响UITableView的滚动。如何使用NSOperation mainqueue使UITableView的滚动顺畅?

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

但是,在最近几天,我注意到一个示例代码是使用NSOperation。 我模仿了零件,使桌面单元格使用NSOperationmainQueue加载。 我预料它会减税tableview的滚动性能,因为主要线程处理单元格加载和tableview滚动,据我所知。

但是,令人惊讶的是,它没有。单元格加载和tableview滚动的表现是完美的。 我仍然想知道这可以如何。

我想我要么错了,要么想念什么。 你能让我知道它是什么吗?

+1

提供一个链接到示例代码。 – trojanfoe

+1

用相关代码更新你的问题。 – rmaddy

+0

膝盖颠簸:GCD!=线程;不要使用阻止图像抓取。阻塞线程的阻塞映像获取比连接到runloop的阻塞映像效率低。 – Tommy

回答

0

iOS的应用程序的主线程由两个部分组成:

•运行循环

•主队列

主要调度队列是一个全局串行队列 执行任务在应用程序的主线程上。这个队列 应用程序的运行循环的工作原理(如果存在的话),以用附着在运行循环其他事件源 执行交织的排队任务的 执行。因为它运行在应用程序的主线程 上,所以主队列通常用作应用程序的关键同步点 。

Source

在你的视图控制器你的代码运行在运行循环(不知道这个)。这就是为什么你不能执行任何长期任务。

但你可以将这些任务委托给主队列(这就是你正在做的)。当你这样做时,OS 交错运行循环和主队列之间的执行(加载图像)。这就是为什么滚动视图仍然非常平滑。

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

0

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

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

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