[SC] SwiftUI에서 Tasks 실행

발행: (2026년 3월 14일 오후 11:43 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

검색 예제와 .task의 관계는?

search(_ query: String) 예제로 돌아가 보겠습니다. 여기서는 500 ms 디바운스를 적용해 항목들을 필터링합니다. 이 예제에서는 Task에 대한 참조를 저장해 두었다가 나중에 취소할 필요가 있습니다. 이는 ObservableArticleSearcher 클래스 안에서 이루어집니다. 이후 뷰에서는 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!")
  }
}

.taskid: 매개변수는 무엇에 쓰나요?

.task()는 뷰가 나타나기 전에 작업을 시작합니다. id: 매개변수의 값이 바뀌면 이전 작업이 자동으로 취소되고 새로운 작업이 다시 시작됩니다.

.task.priority 매개변수는 무엇에 쓰나요?

Swift Concurrency은 협력형 스레드 풀을 사용하므로, 다른 작업과의 상대적인 동작을 조정하기 위해 우선순위를 변경할 수 있습니다. SwiftUI는 기본적으로 userInitiated 우선순위를 사용합니다. 따라서 필요에 따라 중간(utility)이나 낮은(background) 우선순위로 바꾸는 것이 의미가 있습니다.

참고 문헌

0 조회
Back to Blog

관련 글

더 보기 »

[SC] 전송 가능

GCD와 Swift Concurrency에서 스레드 간에 값을 전달하는 것의 차이점은 무엇인가요? GCD와 마찬가지로, Swift Concurrency(SC)에서도 데이터를 전달해야 합니다.

트라비고

Gemini와 함께 말하는 속도만큼 빠르게 여행하세요! 라이브 에이전트가 몰입형 스토리텔링 및 3D 내비게이션과 만나는 곳. 이 프로젝트는 Gemini Live Ag...에 진입하기 위해 만들어졌습니다.