[IOS] 오류 : UIView.layer must be used from main thread only

“UIView.layer must be used from the main thread only”라는 오류는 주로 백그라운드 스레드에서 UIView의 레이어를 조작하려고 할 때 발생합니다. UIKit 프레임워크는 주로 메인 스레드에서 동작해야 하기 때문에 이 오류가 발생합니다. UIKit과 관련된 작업은 메인 스레드에서 실행되도록 해야 합니다. 이를 해결하기 위해 다음과 같은 방법들을 사용할 수 있습니다:

  1. 메인 스레드에서 작업하기: UIKit 관련 코드를 메인 스레드에서 실행하도록 하면 해당 오류를 해결할 수 있습니다. 보통 비동기 작업이 필요한 경우 GCD(Grand Central Dispatch)를 사용하여 메인 큐에서 작업을 예약할 수 있습니다. 예를 들어, 다음과 같이 작업을 메인 스레드에서 실행할 수 있습니다:
    DispatchQueue.main.async {
    // UIView.layer 조작 코드 작성
    }
    
  2. 메인 스레드에서 실행되도록 강제하기: 경우에 따라 메인 스레드가 아닌 곳에서 코드를 실행해야 할 수도 있습니다. 이러한 경우 아래와 같이 CATransaction을 사용하여 강제로 메인 스레드에서 실행하도록 할 수 있습니다:
CATransaction.begin()
CATransaction.setDisableActions(true)
// UIView.layer 조작 코드 작성
CATransaction.commit()` 

위의 코드는 UIView.layer 조작 시 애니메이션을 비활성화하는 것에 유의합니다. 만약 애니메이션을 유지하고 싶다면 setDisableActions 메서드를 호출하지 않아야 합니다.

  1. 메인 스레드에서 실행되도록 호출 보장하기: UIKit에서 제공하는 다양한 메서드들은 자동으로 메인 스레드에서 실행되도록 보장합니다. 예를 들어, UIKit의 애니메이션 관련 메서드들은 메인 스레드에서 실행되도록 보장되어 있습니다. 이런 메서드들을 사용하면 명시적으로 메인 스레드에서 실행해야 할 필요가 없습니다.

위의 방법들을 적절히 조합하여 코드를 수정하면 “UIView.layer must be used from the main thread only” 오류를 해결할 수 있습니다. 메인 스레드에서 UIKit 코드를 실행하도록 하는 것이 가장 안전한 방법이므로 가능하면 첫 번째 방법을 사용하는 것이 좋습니다.