2013-03-02 3 views
0

일종의 계산을 수행하고 do-while 루프 내에있는 백그라운드 스레드에서 코드가 실행됩니다. 요구 사항의 일부 변경으로 인해 사용자에게 입력을 요구하는 UI를 표시해야합니다. 이 UI 코드는 주 스레드에서 수행해야하며 프롬프트가 입력 된 후에도 논리를 계속 진행해야합니다. 주 스레드에서 dispatch_async를 사용하면 UI가 표시 될 수 있지만 UI가 완료 될 때까지는 단계 -2가 계속되지 않아야합니다. 코드의 흐름을 깨고 단위를 블록으로 옮기지 않고 이것을 달성하는 가장 좋은 방법은 무엇입니까? 예를 들어흐름을 깨지 않고 백그라운드 스레드에서 UI를 표시합니다.

:

-(void) compute 
{ 
    do 
    { 
     //calculate some data 
     // Step -1... 
     ... 
     // Step -2 
     ... 
     ... 
    } while(flag) 
} 

1 단계와 2 단계 사이에, 나는 프롬프트를 표시합니다. 그렇게하는 가장 좋은 방법은 무엇입니까? UI가 완료된 후 메인 스레드가 해고 될 뮤텍스를 사용하여 백그라운드 스레드를 차단하는 것이 괜찮습니까?

답변

1

GCD (Grand Central Dispatch)를 사용합니다. dispatch_sync (또는 dispatch_async)를 사용하여 주 스레드에서 블록을 동 기적으로 (또는 원하는 경우 비동기 적으로) 쉽게 실행할 수 있습니다. 나는 개인적으로 내 EX2Kit 라이브러리 (https://github.com/einsteinx2/EX2Kit)에서 내 래퍼 클래스 EX2Dispatch를 사용하지만, 똑같은 문제가 있습니다. 예를 들어

, 당신이 이런 짓을 할 것이다 :

dispatch_sync(dispatch_get_main_queue(), ^{ 
    // Do some stuff to the UI 
}; 

편집 :

내가 이전의 계산에 기초하여 사용자에게 정보를 표시하기 위해 필요로 읽고 있었다

하지만, 계속하기 전에 사용자의 응답이 필요한 경우 경고를 표시 한 후 루프를 중단 한 다음 다시 호출해야합니다.

인스턴스 변수를 사용하여 루프의 길이를 추적 할 수 있으므로 UIAlertView의 버튼 클릭 위임 메서드에서 같은 지점에서 다시 시작할 수 있습니다.

+0

을보십시오. – rmaddy

0

는 사용자로부터 입력을받을 필요가 있기 때문에이이 경우에 작동하지 않습니다이

dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
dispatch_async(mainQueue, ^(void) { 

    //do stuff here 

    }); 
+0

예, UI가 표시되지만 Step-2가 계속 진행되는 것을 원하지 않습니다. 입력이 없으면됩니다. do-while 루프에있는 것처럼 코드를 블록으로 나누는 것은 너무 번거 롭습니다. –

관련 문제