2012-07-18 6 views
0

나는 다른 작업과 비교하여 때로는 비교적 긴 시간이 걸리는 작업 중 하나의 기능을 가지고 있습니다. 함수가 실행되는 동안 이미지가 나타나서 앱이 여전히 제대로 작동하고 있음을 사용자에게 보여주고 싶습니다. 그것을 할 수 있지만UIView를 새로 고치는시기는 언제입니까? 중간 기능을 새로 고칠 수 있습니까?

방법 I는 다음과 같습니다 본질적으로

_checkImpossibleImage.hidden = NO; 
bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
_checkImpossibleImage.hidden = YES; 

가, 그 다음 눈에 보이지 않는에 이미지를 설정, 볼에 이미지를 설정하는 기능을 수행한다. 그러나이 섹션의 모든 코드가 실행될 때까지 뷰가 업데이트되지 않는 것 같습니다. 다음 함수는 전체입니다 :

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0){ 
     // Do nothing (cancel option selected) 
    } else { 
     if (_buttonKey == @"New") { 

      _checkImpossibleImage.hidden = NO; 
      bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
      _checkImpossibleImage.hidden = YES; 

      ... 
     } 
    ... 
    } 
} 

업데이트하려면 현재보기를 강제 할 수있는 방법이 있나요 또는 함수가 실행하는 동안 '로드'팝업을 생성하는 더 좋은 방법이 있나요?

+0

당신은 조사 할 수 있습니다 : 당신은 주요 파견 큐에 넣어 루프의 다음 이동 - 주변까지 (가난한 메소드 이름이 방법에 의해입니다) isPossible::에 대한 호출을 지연시킬 수 있습니다 [UIView 설명서] (http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/setNeedsDisplay), 특히'needsDisplay' 다시 그려야합니다. 그러나, 나는 중간 기능을 수행하는 다시 그리기에 대해 알고 있지 않습니다. –

+0

기본적으로 동일한 문제 : [UIActivityIndicator가 제대로 작동하지 않습니까?] (0120-386333/ko) –

+0

이 솔루션이 작동했습니다! 나를 올바른 방향으로 가리켜 주셔서 감사합니다. – Valentine

답변

0

이 작업을 수행 할 때 UI를 차단해서는 안되며, 별도의 스레드에서 오랜 시간이 걸리는 메서드를 호출하면 더 좋을 것이라고 생각합니다.

+0

다음 응용 프로그램 동작에 중요하기 때문에 다른 스레드에서 함수를 호출하는 것이 효과가 있다고 생각하지 않습니다. 완료하는데 상당히 많은 시간이 걸리지는 않겠지 만 10 초 정도 걸리 겠지만이 이벤트가 발생했다는 것을 사용자에게 알리는 것이 좋을 것 같습니다. – Valentine

+0

이 메서드가 완료 될 때까지 응용 프로그램을 계속 진행할 수 없으면 메서드를 호출하기 전에 사용자에게 "로드 중 ..."보기를 표시 할 수 있습니다. – Eyal

+1

실제로 10은 너무 길어서 UI를 차단할 수 없습니다. 백그라운드에서 처리하고 알림을 보내어 앱을 다음 단계로 계속 진행하십시오. – nielsbot

0

실행 루프가 끝날 때까지는 그리기가 수행되지 않습니다. 코드 중간에 코드를 생성 할 방법이 없습니다.

_checkImpossibleImage.hidden = NO; 
dispatch_async(dispatch_get_main_queue(), ^{ 
     bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
     _checkImpossibleImage.hidden = YES; 
     // More code to deal with the value of ratioIsPossible 
}); 
+0

경고보기 단추 누르기에 대한 응답으로 발생하므로 적절한 응답이 될지 잘 모르겠습니다. 따라서 다음에 단추를 누를 때까지이 기능이 다시 실행되지 않을 수도 있습니다. 그러나 더 나은 명명 규칙에 대한 조언을 해 줄 수 있습니까? – Valentine

+0

귀하의 의견을 이해할 수 없습니다. 이 방법을 다시 실행해야하는 이유는 무엇입니까? –

+0

글쎄, 아마도 당신이 제안한 해결책을 이해하지 못했을 것입니다. 루프의 다음 번 수행을 말할 때 정확히 무슨 뜻입니까? Objective-C와 Xcode를 사용하는 데 상당히 익숙하므로 전반적인 프로세스와 동작에 익숙하지 않습니다. – Valentine

관련 문제