[SC] SwiftUI에서 Tasks 실행
Source: Dev.to
검색 예제와 .task의 관계는?
search(_ query: String) 예제로 돌아가 보겠습니다. 여기서는 500 ms 디바운스를 적용해 항목들을 필터링합니다. 이 예제에서는 Task에 대한 참조를 저장해 두었다가 나중에 취소할 필요가 있습니다. 이는 Observable인 ArticleSearcher 클래스 안에서 이루어집니다. 이후 뷰에서는 onChange(of:)를 통해 search(_:) 메서드를 호출합니다.
@MainActor
@Observable
final class ArticleSearcher {
private static let articleTitlesDatabase = [
"Article one",
"Article two",
"Article three",
]
var searchResults: [String] = ArticleSearcher.articleTitlesDatabase
private var currentSearchTask: Task?
func search(_ query: String) {
currentSearchTask?.cancel()
currentSearchTask = Task {
do {
try await Task.sleep(for: .milliseconds(500))
print("Starting to search!")
searchResults = Self.articleTitlesDatabase.filter {
$0.lowercased().contains(query.lowercased())
}
} catch {
print("Search was cancelled!")
}
}
}
}.task 수정자는 어떻게 동작하나요?
SwiftUI는 .task()를 통해 뷰의 생명 주기에 Task를 연결할 수 있게 해줍니다. 뷰가 나타나기 전에 작업이 예약되고, 뷰가 사라지면 자동으로 취소됩니다. 이제 Task { }로 작업을 감싸는 대신 메서드 시그니처를 async로 선언하기만 하면 됩니다.
search(_ query: String)의 최종 형태
func search(_ query: String) async {
do {
try await Task.sleep(for: .milliseconds(500))
print("Starting to search!")
searchResults = Self.articleTitlesDatabase
.filter { $0.lowercased().contains(query.lowercased()) }
} catch {
print("Search was cancelled!")
}
}.task의 id: 매개변수는 무엇에 쓰나요?
.task()는 뷰가 나타나기 전에 작업을 시작합니다. id: 매개변수의 값이 바뀌면 이전 작업이 자동으로 취소되고 새로운 작업이 다시 시작됩니다.
.task의 .priority 매개변수는 무엇에 쓰나요?
Swift Concurrency은 협력형 스레드 풀을 사용하므로, 다른 작업과의 상대적인 동작을 조정하기 위해 우선순위를 변경할 수 있습니다. SwiftUI는 기본적으로 userInitiated 우선순위를 사용합니다. 따라서 필요에 따라 중간(utility)이나 낮은(background) 우선순위로 바꾸는 것이 의미가 있습니다.