2013-02-20 3 views
1

상황에 따라 진행 상황을 표시하고 싶지만 진행 상태 표시 줄은 변경되지 않았습니다. 내가해야 할 일은 무엇입니까? 이 progress는 부동 소수점과 0에서 1.0로 이동해야 다음, UIProgressView 경우 원래의 질문에dispatch_group_async에서 progressBar가 변경되지 않는 이유는 무엇입니까?

dispatch_group_t group = dispatch_group_create(); 
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 

dispatch_group_async(group, queue, ^{ 
    for (int i = 0; i < 100; i++) 
    { 
     dispatch_group_async(group, dispatch_get_main_queue(),^{ 
      self.progressBar.progress = (float)i/100; 
     }); 

     // do big somethings 
    } 
}); 

답변

1

, 당신은 0에서 100 사이의 정수로 progress을 설정했다. 당신이 정말로 그룹을 사용하지 않는 때문에

dispatch_group_t group = dispatch_group_create(); 
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 

dispatch_group_async(group, queue, ^{ 
    for (int i = 0; i < 100; i++) 
    { 
     dispatch_group_async(group, dispatch_get_main_queue(),^{ 
      self.progressBar.progress = ((CGFloat) i)/100.0; 
     }); 

     // do big somethings 
    } 
}); 

또는, 더 간단하게 (만 글로벌 큐에 하나의 작업이, 일련 큐를 처리 할 때 그룹은 일반적으로 중복) :

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 

dispatch_async(queue, ^{ 
    for (int i = 0; i < 100; i++) 
    { 
     dispatch_async(dispatch_get_main_queue(),^{ 
      self.progressBar.progress = ((CGFloat) i)/100.0; 
     }); 

     // do big somethings 
    } 
}); 

아직 진행률보기 업데이트가 표시되지 않는 경우 올바르게 연결되지 않은 IBOutlet과 같은 단순한 항목이어야합니다. self.progressBarnil이 아닌지 확인하십시오. progress0.5으로 설정하고 제대로 반영되는지 확인하십시오.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

동시 큐이기 때문에, 내가 진행 상태를 업데이트 할

dispatch_queue_t queue = dispatch_queue_create("com.company.myqueue", NULL); 

을 사용하는 것이 좋습니다

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

dispatch_async(queue, ^{ 

    // async stuff 

    dispatch_sync(dispatch_get_main_queue(), ^{ 

     // sync stuff 
    }); 
}); 

dispatch_release(queue); 
+0

코드에서 진행 상태가 변경되었지만 중요하지는 않습니다. – dobiho

+0

@dobiho 답변에 대한 최근 편집이 좋아 보인다. 업데이트가 표시되지 않으면 'IBOutlet'을 의심 할 것입니다. 위의 내 대답은 진행률보기를 잘 업데이트하는 코드입니다. 그것이 당신을위한 것이 아니라면, 그것은'IBOutlet'처럼 단순 할 것입니다. 'self.progressBar'가'nil'이 아닌지 확인하십시오. – Rob

-1

당신은 메인 스레드에서 진행 표시 줄을 업데이트해야합니다.

+3

그는 UI 업데이트를 위해 기본 대기열을 사용하고 있습니다. 또한 UI 업데이트를 동 기적으로 디스패치 할 필요가 없습니다. 포 그라운드 큐가 다른 작업을 수행하는 경우 배경 대기열을 고정하는 이유는 무엇입니까? 'dispatch_async'가 일반적으로 바람직합니다. – Rob

+0

@Rob이 지적한 것처럼이 답변은 질문에 답하지 않고 잘못된 조언을 제공합니다. – ctietze

0

:

관련 문제