SwiftUI에서 애니메이션을 사용할일이 생겼는데 withAnimation이나 animation modifier를 사용하지 않고 Task에서 변수에 0.001씩 더하는 방식으로 코드를 작성해보았습니다.
예제코드는 대충 아래와 비슷합니다.
@State private var animationValue = 0
func startAnimation() {
Task {
for i in 0..<2000 {
animationValue += 0.001
}
}
}
이러한 방식으로 애니메이션을 작성해봤을때의 문제점이 몇가지 보였는데, Background 쓰레드에서 다른 무언가가 계속 실행되고 있을때(SpriteKit같은 경우에 Background를 같이 사용하는것으로 보입니다) 다른 무언가의 순서를 대기하느라 애니메이션이 원하는 속도와 모양으로 작동하지 않을수도 있다는 사실을 발견했습니다.
또한, 새로운 ViewModel을 추가하고 그것을 @StateObject나 @ObservedObject로 선언하여 추가하였을때 작동이 잘 안되는 모습이 나타났는데 @StateObject나 @ObservedObject 변수들이 선언되어져 있는 View는 업데이트 될때마다 View를 새로 그린다고 하는데 백그라운드에는 아직 요청한 애니메이션이 남아있는 상태에서 새로 그리니까 뭔가 충돌이 생겨서 문제가 있는것 같습니다.
해결방법으로는 withAnimation과 animation modifier를 적절히 섞어서 사용하는 것입니다.