2012-10-26 41 views
1

我有一個應用程序的界面上約10個對象。這些對象基本上是一個按鈕,它具有顯示哪個按鈕在給定時間內處於活動狀態的輝光。當選擇一個按鈕時,其發光被打開並且所有其他按鈕的發光被關閉。iOS - 塊緩慢地獄

要打開和關閉的光暈,我有這個

[buttons enumerateObjectsWithOptions:NSEnumerationConcurrent 
            usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if (obj == sender) 
      [(myButtonClass *)obj showGlow]; 
    else { 
      [(myButtonClass *)obj hideGlow]; 
    } 
}]; 

,但我不得不改變這個

[buttons enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

    if (obj == sender) 
      [(myButtonClass *)obj showGlow]; 
    else { 
      [(myButtonClass *)obj hideGlow]; 
    } 
}]; 

去除枚舉的並行部分。問題在於,對於某些按鈕而言,輝光需要5秒鐘才能打開或關閉,但只能使用相同的按鈕。我的印象是,他們在一個正在處理的隊列順序(????? !!!)

showGlow/hideGlow方法基本上是兩行:設置變量並設置隱藏屬性輝光imageView打開和關閉。所以,這些是所有按鈕的快速方法。

我不明白的是爲什麼問題發生在某些按鈕上,而不是其他人,以及爲什麼塊需要這麼長時間來處理應用程序基本閒置時。

任何線索?謝謝。

回答

5

「慢」UI更新的一個原因可能是,使用NSEnumerationConcurrent選項時,枚舉發生在主線程以外的線程上。由於所有UI更新都應該發生在主線程上,因此您的UI更改不會立即反映出來,而是在運行循環刷新所有更改後延遲。

在你的情況下,你只有10個對象,這不合理的使用併發選項。

for (UIButton *button in buttons) { 
    if (button == sender) [button showGlow]; 
    else [button hideGlow]; 
} 

你可以嘗試,如果你開始一個活動的指標觀察同一個延遲UI更新:此外,當你可以使用簡單易讀,或者說事的快速列舉,forin與塊的代碼,爲什麼複雜化某處,然後停在後臺線程中。直到實際停止爲止需要幾秒鐘的時間。

如果你堅持使用塊,你必須調用在主線程中所有的UIKit方法:

[buttons enumerateObjectsWithOptions:NSEnumerationConcurrent 
           usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if (obj == sender) 
     // One possibility with GCD and dispatch_async on the main queue 
     dispatch_async(dispatch_queue_get_main(), ^{[(myButtonClass *)obj showGlow];}); 
    else { 
     // another possibility to call the selector on the main thread 
     [(myButtonClass *)obj performSelectorOnMainThread:@selector(hideGlow)]; 
    } 
}]; 
+0

感謝。我忘了UI更新的東西不得不在主線程中發生......謝謝。 – SpaceDog

+0

@RubberDuck歡迎您:) – iska