Tong's Blog

[SwiftUI] task 와 onAppear 차이 본문

iOS/Swift

[SwiftUI] task 와 onAppear 차이

통스 2024. 3. 12. 22:56
반응형

안녕하세요.

1년만에 포스팅이네요. 최근에 SwiftUI 를 공부하고 작업하며 나온 이슈들에 대해 포스팅을 해보려고 합니다.

 

우리가 특정 View 가 나타나고 나서 실행되길 원하는 동작들이 있겠죠? (Ex: 네트워크 요청)

기존 UIKit 에서는 View Life Cycle 에 있는 method 들인  viewWillAppear    viewDidAppear  를 override 해서 사용했었죠?

import UIKit

class ViewController: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
    	super.viewWillAppear(animated)
        // 네트워크 요청
        print("View Will Appear"")
    }
}

 

그런데 SwiftUI 에서는 해당 메소드를 사용할 수 없기 때문에 .onAppear() 라는 modifier 를 사용했는데요

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
            .onAppear {
                // 네트워크 요청
                print("View appeared")
            }
    }
}

 

 

iOS 15 에서 새로운 modifier 로 .task() 가 나왔다고 합니다.

사용하는 법은 기존 onAppear 대신 task 를 사용하는데요.

 

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
            .task {
                // 네트워크 요청
                print("View appeared")
            }
    }
}

 

https://developer.apple.com/documentation/swiftui/view/task(priority:_:)

Return Value
A view that runs the specified action asynchronously before the view appears.

Discussion
Use this modifier to perform an asynchronous task with a lifetime that matches that of the modified view. If the task doesn’t finish before SwiftUI removes the view or the view changes identity, SwiftUI cancels the task.Use the await keyword inside the task to wait for an asynchronous call to complete, or to wait on the values of an AsyncSequence instance. For example, you can modify a Text view to start a task that loads content from a remote resource:

 

View Appear 되기전에 비동기적인 액션을 실행할 수 있다고 합니다.

또한 뷰를 제거할때 비동기 작업이 완료되지 않는 경우도 있을 경우도 있는데 요기서 SwiftUI 가 해당 작업을 취소해준다고 합니다.

요 부분이 .onAppear() 와 큰 차이점이 아닐까 싶습니다.

 

.task() 가 나옴으로써 비동기 작업들은 .task 로 쓰고 동기작업이거나 view 가 update 될때 필요한 코드들은 .onAppear() 쓰면 되지 않을까 합니다.

반응형
Comments