为什么私有队列在主队列更新UI之后调度_async更新UI?

高拉夫·贾恩

使用后台线程更新UI的理想方法是

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
    //Background Thread
    dispatch_async(dispatch_get_main_queue(), ^(void){
        //Run UI Updates
    });
});

但是,即使不使用主队列,我们​​也可以更新UI

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
    //Background Thread
    //Run UI Updates
});

因此,我正在使用beizer路径绘制一些点,这些点来自iPad UIPanGestureRecognizer。现在,我在主线程上绘制这些点,并旋转这些点以获取新点,并使用背景线程(并发)绘制这些新点。这是我的代码:

CGPoint touchPoint = [sender locationInView:self.view];
[pencilLayer[0] addPoint:touchPoint];
for(int i = 1; i < 4; i++)
{
    dispatch_async(privateQueue, ^{
        CGPoint point = Rotatepoint(500, 500, 45(degree), touchPoint);
        [pencilLayer[i] addPoint:point];
    });
}

我的问题是:主线程和专用队列应同时在UI上绘制。为什么释放手势后,privateQueue在UI上绘制点?

米兰诺萨

好吧,根据文档,通常最好保留在主线程上操纵UI的代码:

线程和用户界面

如果您的应用程序具有图形用户界面,建议您接收与用户相关的事件,并从应用程序的主线程启动界面更新。这种方法有助于避免与处理用户事件和绘制窗口内容相关的同步问题。某些框架(例如Cocoa)通常需要此行为,但是即使对于那些不需要的框架,在主线程上保留此行为也具有简化用于管理用户界面的逻辑的优势。

现在,在您的特定情况下,这可能正是发生您的情况的确切原因。但是无论如何,在您的特定情况下,我认为没有充分的理由在专用队列上执行绘图。但是出于某些原因,您应该将其保留在主线程上-代码会操纵UI,因此建议将其保留在主线程上(请参见上面的参考)。而且,点图并不是性能上的详尽操作-没有充分的理由将其放在背景上。

因此,我建议删除私有队列上的该调度,并简单地使用以下命令:

CGPoint touchPoint = [sender locationInView:self.view];
[pencilLayer[0] addPoint:touchPoint];
for(int i = 1; i < 4; i++)
{
    CGPoint point = Rotatepoint(500, 500, 45(degree), touchPoint);
    [pencilLayer[i] addPoint:point];
}

另外,请检查此博客条目中有关线程和UI的信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

NSOperationQueue同步问题:辅助队列比主队列更新UI快

为什么 DispatchGroup 会干扰主队列?

performSelectorOnMainThread:和主队列上的dispatch_async()有什么区别?

为什么Linux调度程序具有运行队列的锁?

ios / swift调度队列-全局和主队列概念

GCD主队列和主线程有什么区别?

为什么 UI 没有为 async/await 功能更新

如何在没有死锁的情况下同步调度到主队列?

将对象从主队列中的父上下文传递到私有队列中的子级

为什么队列不在主线程上更新?

主队列相关查询的调度同步 [ios, swift]

没有在模态运行循环中执行主队列上的dispatch_async块

为什么react的UI组件没有更新?

何时使用主队列

从针对另一个调度队列的主线程发出dispatch_sync时,主队列/主线程会发生什么情况?

为什么我需要在以下场景中使用 ReactJS state 在 AJAX 之后更新 UI

为什么我的HandlerThread更新UI

为什么只有Android中的UI线程才能更新UI?

RabbitMQ中更新的队列

更新 UI 的最佳 Android 调度程序

RNFetchBlob需要主队列设置

使用dispatch_async + dispatch_get_main_queue进行UI更新有什么意义?

为什么双端队列比队列快?

当应用重新启动进入后台时,是否会调度主队列?

在完成执行DispatchWorkItem并尝试使用DispatchQueue.main.async更新UI之后,UI视图项是否可能不再有效

为什么使用@IBAction func 时UI 没有及时更新?

为什么UI有时无法通过数据绑定在recyclerview中更新?

为什么在更改State var后我的快速ui视图没有更新?

并发调度队列没有被阻塞