Avatar
浅漬けの素 9/4/2023 1:04 PM
初学者です。Actorを利用した共有リソースについての質問です(既出でしたら申し訳ありません)。 Actor内の静的プロパティを複数スレッドで非同期に更新し、共有リソースとして様々なメソッドで参照しています。が、更新・参照の際にデータ競合?と思われるエラーが頻発します。 伺いたい点は主に 1.actorのメソッド、プロパティの使い方が正しいか 2.キャッシュのような使い方をしているので、最悪参照がうまくいかなくてもよく、もし同様の目的でもっといい方法があれば… 3.できれば、同期的なメソッド内でプロパティを参照したい 4.await無しで使えてしまっていて困惑している 何卒ご教授いただけないでしょうか..!
1:04 PM
Struct AccountData { let accountId : String let accountName : String //省略 } actor AccountDataStore { //******Error: EXC_BAD_ACCESS など static var accountDataStore : [String:AccountData] = [:] //******Error: unrecognized selector sent to instance など static func addAccountData(_ data: AccountData) { AccountDataStore.accountDataStore[data.accountId] = data } static func addAccountDataArray(_ data: [AccountData]){ for data in data{ AccountDataStore.accountDataStore.updateValue(data, forKey: data.accountId) } } static func removeAccountData(_ accountId: String) { AccountDataStore.accountDataStore.removeValue(forKey: accountId) } static func removeAccountAllData(){ AccountDataStore.accountDataStore.removeAll() } static func removeAccountDataArray(_ data:[String]){ for data in data{ AccountDataStore.accountDataStore.removeValue(forKey: data) } } } //利用例 func getAccount(id:String)->[AccountData]{ if let account = AccountDataStore.accountDataStore[id]{ return account }else{ //server request AccountDataStore.addAccountData(data) return data } } func getAccountAsync(id:String) async -> [AccountData]{ if let account = AccountDataStore.accountDataStore[id]{ return account }else{ //server request AccountDataStore.addAccountData(data) return data } } func addAccountDataWithIdsAsync(accountIds:[String]) async throws { try await withThrowingTaskGroup(of: AccountData.self){ group in for id in accountIds{ group.addTask{ return try await getAccountAsync(id:id) } } for try await (id, data) in group{ await AccountDataStore.addAccountData(data) } } }