簡體   English   中英

為什么私有隊列在主隊列更新UI之后調度_async更新UI?

[英]Why private queue dispatch _async update UI after main queue update 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的信息。

您為每個點添加一個項目到后台隊列。 這應該表現不佳,並可能導致滯后。 最好將一個項目添加到后台隊列中:

CGPoint touchPoint = [sender locationInView:self.view];

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

這將立即繪制所有點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM