for
루프는 주 스레드 또는 백그라운드 스레드에서 실행 중입니까? 기본 스레드에서 실행중인 경우 GUI는 진행 상황 변경 사항을 반영하여 자체를 업데이트 할 수있는 기회를 얻지 못합니다. 이는 런 루프가 끝날 때 (즉, 기능 실행이 끝난 후)에만 발생하기 때문입니다.
for
루프가 백그라운드에서 실행 중이면 장난입니다. 메인 스레드를 제외한 어느 곳에서나 GUI를 업데이트하면 안됩니다. 최신 시스템을 목표로한다면 GCD를 사용하여이 문제를 쉽게 해결할 수 있습니다.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
for (int i = 0; i < n; i++) {
// do stuff
dispatch_async(dispatch_get_main_queue(), ^(void) {
// do your ui update here
});
}
});
양자 택일로, 당신은 더욱 GCD를 활용하고 dispatch_apply
를 사용하도록 for
루프를 다시 작성할 수 있습니다. 의 등가는 위의 것 :
dispatch_apply(n, DISPATCH_QUEUE_PRIORITY_DEFAULT, ^(size_t i) {
// for loop stuff here
dispatch_async(dispatch_get_main_queue(), ^(void) {
// do your ui update here
});
});
주 dispatch_apply
를 사용하여 루프의 각 "반복"가 서로에 대해 동시에 실행되므로이 적용되지 않습니다 수 있음을 의미하여 for
루프 경우 직렬 방식으로 실행해야합니다.