2012-10-26 2 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 상관 때 게다가, 왜 블록의 코드를 복잡하게 어딘가에, 다음 백그라운드 스레드에서 중지하십시오. 실제로 멈출 때까지 2 초가 걸릴 것입니다. 당신이 블록을 사용하여 주장하는 경우

, 당신은 메인 스레드의 모든 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

관련 문제