公式サンプルコードを見ながら作りました。
👉 【SwiftUI】SwiftData でスレッドセーフにバックグラウンドでデータを扱う - @ModelActor
🔄 謎
サンプルコードに従った流れで実装しました。
ModelActor の内部 に static な自己インスタンスを持って、
@ModelActor
actor BirdBrain {
private(set) static var shared: BirdBrain!
static func createSharedInstance(modelContext: ModelContext) {
shared = BirdBrain(modelContainer: modelContext.container)
}
func process(transaction verificationResult: VerificationResult<Transaction>) async {
}
func status(for statuses: [Product.SubscriptionInfo.Status], ids: PassIdentifiers) -> PassStatus {
}
func checkForUnfinishedTransactions() async {
}
func observeTransactionUpdates() {
}
View の onAppear() でインスタンス生成。ModelActor 内の関数は Task 内で呼ぶ。
struct BackyardBirdsShopViewModifier: ViewModifier {
@Environment(\.modelContext) private var modelContext
func body(content: Content) -> some View {
ZStack {
content
}
.subscriptionPassStatusTask()
.onAppear {
BirdBrain.createSharedInstance(modelContext: modelContext)
}
.task {
await BirdBrain.shared.observeTransactionUpdates()
await BirdBrain.shared.checkForUnfinishedTransactions()
}
👉 sample-backyard-birds/Multiplatform/Shop/BirdBrain.swift at 832515e4abb9224c1970e40a3bd9b82900019187 · apple/sample-backyard-birds
👉 sample-backyard-birds/Multiplatform/Shop/BackyardBirdsShopViewModifier.swift at main · apple/sample-backyard-birds
というかんじで、
- ModelActor の内部 に static な自己インスタンスを持つ。
- View の onAppear() でインスタンス生成。
- ModelActor 内の関数は Task 内で呼ぶ。
このきまりで実装すると動くっちゃあ動くけど。
しかし、この ModelActor ってなぜ生きてるの?
いつ死ぬの?
死んでるように見えるけど、なぜ関数が呼べるのですか。
View と一緒に死ぬ?