class PhotoProcessor {
func extractSticker(data: Data, with id: String?) async -> Sticker? { }
}
@MainActor
final class StickerModel {
let photoProcessor = PhotoProcessor()
func extractSticker(_ item: PhotosPickerItem) async throws -> Sticker? {
guard let data = try await item.loadTransferable(type: Data.self) else {
return nil
}
return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
/*
MainActor 내부에서 호출되고 백그라운드에서 실행되는 바람에
MainActor와 백그라운드가 data-race 문제 발생 가능
*/
}
}
async 함수들이 묵시적으로 백그라운드에서 실행됨.data-race 문제가 발생할 수 있었음. (물론 컴파일러가 오류를 알려줌)(별도의 Xcode bulid setting 으로 설정 해야 함)위에서 설명한 호출된 Actor에서 실행되는 비동기 함수를 기존처럼 백그라운드에서 실행하게 하는 attribute
// Explicitly offloading async work
class PhotoProcessor {
var cachedStickers: [String: Sticker]
func extractSticker(data: Data, with id: String) async -> Sticker {
if let sticker = cachedStickers[id] {
return sticker
}
let sticker = await Self.extractSubject(from: data)
cachedStickers[id] = sticker
return sticker
}
@concurrent
static func extractSubject(from data: Data) async -> Sticker {}
}
@concurrent attribute를 이용해 해당 비동기 함수를 명시적으로 백그라운드에서 동작하도록 선언