본문 바로가기

iOS/iOS

[iOS, concurrency] publishing changes from background threads is not allowed;

728x90

 

Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

Background queue에서 UI 관련된 작업을 수행하면 다음 문구가 Xcode에 보라색으로 발생합니다.

해당 알람은 런타임에서 확인할 수 있습니다.

Main queue에서 실행할 수 있도록 변경해주면 됩니다.

 

해결방법

다음과 같이main queue에서 async로 동작하도록 했습니다.

DispatchQueue.main.async { [weak self] in
	self?.myText = "blah blah"
}

 

왜 weak self인가?

여기서 self를 사용해서 뷰의 내용을 변경하지 않고 weak self를 사용했습니다.

그 이유는 메모리 참조와 관련이 있습니다.

해당 구문을 실행하는 뷰모델(class)는 메모리 어떤 공간에 있을거고, async의 실행 클로저도 메모리 어떤 공간에 있을 겁니다.

실행 클로저에서 뷰모델 인스턴스의 접근해야하는데요.

만약에 경우에 뷰모델 인스턴스가 메모리에서 제거된 경우에는 self로 접근이 불가능할 수 있습니다.

그래서 weak self를 사용합니다.

즉, 클로저에서 접근할 대상이 있을수도있고 없을수도 있기 때문에, 그 없을수도있는 상황을 대비한 것입니다.

'iOS > iOS' 카테고리의 다른 글

[iOS] GCD, multithreading in iOS  (0) 2021.11.25
[SwiftUI] some View의 some에 대해서  (1) 2021.11.23
[Swift] Struct 그리고 Class  (0) 2021.10.26
iOS 📱 개발에 유용한 사이트 정리  (0) 2021.09.23