2014-06-11 5 views
0
UIView *test=[[UIView alloc]initWithFrame:CGRectMake(20, 150, 10, 20)]; 
[test setBackgroundColor:[Util colorWithHexString:@"#FF00007f"]]; 
[self.view addSubview:test]; 
int testNum=0; 
for(int i=0;i<50;i++){ 
    testNum=0; 
    //do something spend 100 ms 
    while(testNum<800){ 
     testNum+=1; 
    } 
    [test setFrame:CGRectMake(20, 150, 10+i*200/50, 20)]; 
} 

사용자 정의 진행률 표시 줄을 작성하고 싶습니다.iOS에서 UIView setFrame이 작동하지 않는 이유

위와 비슷하지만 uiview는 마지막 루프에서만 다시 그리기 만합니다.

어떻게 문제를 해결할 수 있습니까? 그리고, 어떻게됩니까?

감사합니다.

나는

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    int testNum=0; 
    for(int i=0;i<50;i++){ 
     testNum=0; 
     while(testNum<800){ 
      NSLog(@"%d",testNum); 
      testNum+=1; 
     } 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [test setFrame:CGRectMake(20, 150, 10+i*200/50, 20)]; 
     }); 

    } 
}); 

이 작업에 코드를 변경할 수 있지만 루프 동안 그냥 내 프로젝트에 블록 코드에 대한 상황을 시뮬레이션 할 수 있습니다.

사실, 시간 코드는 목록 항목을 할당하고 초기보기이기 때문에 주 스레드에서 필요합니다.

제안 사항?

감사합니다.

+0

"동시성 프로그래밍"또는 "멀티 스레딩"또는 Apple에서 제공하는 여러 용어 및 시스템 중 하나 인 Global Distribution Center에 대해 알아보고 학습해야합니다. 기본적으로 문제를 "코드에서 100 가지를 수행한다고 말하면됩니다"라고 생각하지만, "화면을 업데이트하는"행위는 100 가지 모두 후에 일어날 수 있습니다. ". –

+0

새로운 코드에 대해서는 말할 것도없고, 이론적 인 것이지 실제적인 것이 아닙니다. 임의로 진행 막대를 타이밍하는 것은 일반적인 구현이 아니라고 말할 수 있습니다. –

+0

고맙습니다. for 루프를 제거합니다. 그런 다음 진행률 표시 줄 다시 그리기 후 하나의 목록 항목을로드하십시오. – miterfrants

답변

0

iPhone에서 실행되는 "do something spend 100ms"루프가 단지 몇 사이클이 걸리므로 코드가 작동하지만 보이지 않는 진행 상황을 볼 수있을만큼 길게 멈추지는 않습니다.

또한 UI 스레드를 잠그는 것이 좋습니다.

+0

그것은 while 루프 동안 화면이 다시 그려지는 것을 의미합니까? SpriteKit에서 너무 멀리까지 머리를 숙일 수도 있지만 for/while 루프 동안 시각적 업데이트를 표시하려면 멀티 스레딩이 필요하지 않습니까? –

관련 문제