백그라운드에서 값을 계산하고 Swift 동시성 이후에 결과 사용

값을 계산해야 하고 메인 스레드를 차단하지 않으려면 계산된 값을 반환하는 Swift Task 구조에서 해당 값을 계산하면 됩니다. Swift 동시성 이전에는 백그라운드 대기열로 이동하여 필요한 값을 계산하고 필요한 경우 몇 가지 작업을 진행할 것입니다.

예를 들어 보겠습니다. Example 값을 계산하고 반환하려고 시도하는 초기 작업을 생성하는 String라는 구조체를 정의했습니다. 구조체에는 계산된 값을 반환하는 value()라는 비동기 메서드도 있습니다.

struct Example {

  private var someTask: Task<String, Error> = Task {
    // Some calculation
    try await Task.sleep(nanoseconds: 3_000_000_000)
    return "example"
  }

  func value() async throws -> String {
    return try await someTask.value
  }
}


계산된 값에 액세스하려는 경우 Swift Task 구조에 정의된 value 속성을 사용할 수 있습니다. 작업이 완료되지 않은 경우 이 속성에 액세스하면 작업이 완료될 때까지 대기하고 우선 순위가 현재 작업의 우선 순위로 높아집니다.
Example 구조를 사용하려면 이를 인스턴스화하고 비동기 컨텍스트에서 값을 읽어야 합니다.

let example = Example()

Task {
  do {
    print("Value is:", try await example.value())
  }
}


작업에서 오류가 발생하지 않으면 해당 유형은 Task<ReturnType, Never>가 되고 작업 값에 액세스할 때 try 키워드를 사용할 필요가 없습니다.

이것은 사전에 무언가를 계산하고 싶고 사용자가 요청하면 즉시 가지고 있는 상황에서 도움이 되었습니다. 예를 들어, 사용자가 이미지를 보내기 위해 버튼을 누를 경우를 대비하여 카메라에서 이미지를 압축하고 싶었습니다. 이미지 미리보기 화면에서 압축을 시작하고 사용자가 전송을 원할 때 압축된 이미지를 준비합니다.

좋은 웹페이지 즐겨찾기