본문 바로가기
개발/ios

스레드에서 반복문으로 UI를 변경할때 주의할점

by 매몰 2018. 7. 30.

 

 

 

내가 만든 스레드에서 UI를 바꿀수 없다는것은 누구나 알것이다. 물론 젖먹이 개발자 시절에 난 몰랐다...

 

어잿든 내 스레드에서 UI를 바꿀려면 메인스레드를 호출해야 한다. ios 에서는 DispatchQueue.main.async 이 그 역활을 한다.

 

짐작했겠지만 메인스레드는 새로 만들어지는게 아니므로 당연히 동기적으로 움직인다. 

 

최근까지도 이 사실을 자주 망각했다. 바로 반복문에서 메인스레드를 호출할때였다.

 

내 스레드에서 메인스레드를 반복문으로 돌릴때는 서로가 따로 놀기 때문에 (내 스레드와 메인스레드가 서로 비동기라서) 메인스레드에서 UI가 아직 변경되지도 않았는데 내 스레드에서 또 호출해 버린다. 이렇게 되면 버벅거리는 현상이 발생한다.

 

테스트할때서야 버벅거림을 발견하고 짜증내다 아... 하고 숙연해 진적이 한둘이 아니었다.

 

아래를 보면 스레드에서 ui를 10번 갱신한다.

하지만 apply변수를 뺀다면 10번이 다 갱신 되지 않고 중간에 몇번은 건너뛰어 결국 일부만 실행되는것 처럼 보일것이다.

 

 

//스레드 시작

 

Thread(target: self, selector: #selector(runLoop), object: nil).start()

 

 

//스레드 실행 함수

@objc func runLoop() {

    var apply = true

    var count = 0

        

    while count < 10 {

        //메인스레드에서 작업이 완료되었을때만 실행

        if apply {

            //시작

            apply = false

            count += 1

                

            DispatchQueue.main.async {

                //ui 변경

                //...

                setNeedsDisplay()

                    

                //완료

                apply = true

            }

        }

    }

 

}

 

 

 

쉽게 말해 동기화를 해야 한다는 말이다.

 

알면서도 실수할수 있으니 항상 유념하자.

 

 

 

 

 

 

도움이 되셨다면~ 정성으로 빚은 저희 앱!  많은 이용 바래요:)

 

https://meorimal.com/index.html?tab=spaceship

 

우주선 - 방치형 인공지능 투자 체험기

미리 맛보는 인공지능 투자!

(주)머리말 meorimal.com

 

https://meorimal.com/subway.html

 

지하철어디있니

더이상 고민하지 마세요. 뛸지 말지 딱 보면 알죠.

(주)머리말 meorimal.com

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기