Middle
Kas seejuhtum nõuab asünkroonse täitja kasutamist?
sobes.tech AI
Vastus AI-lt
Jah, see on vajalik.
Kui pääsete actor-ile väljastpoolt eraldatud kontekstist (selles juhul globaalsest kontekstist), tagab kompilaator niidi-turvalisuse, nõudes asünkroonset juurdepääsu.
// Demonstratiivne protokoll
protocol DataFetcher {
func fetchData() async -> String
}
actor DataCache {
var cache: [String: String] = [:]
func updateCache(key: String, value: String) {
cache[key] = value // Toimib `actor`-i eraldatud kontekstis
}
func cachedData(forKey key: String) -> String? {
return cache[key] // Toimib `actor`-i eraldatud kontekstis
}
nonisolated func clearCacheIsolated() {
// See funktsioon on märgitud kui nonisolated ja ei pääse `actor`-i olekule ligi
// Ligipääsuks on vaja asünkroonset väljakutset
}
}
class DataLoader {
let cache: DataCache // Viide `actor`-ile
init(cache: DataCache) {
self.cache = cache
}
func loadData(key: String) async -> String {
// Asünkroonne juurdepääs `actor`-ile
if let cached = await cache.cachedData(forKey: key) {
return cached
}
// ... andmete laadimise loogika ...
let newData = "Data for \(key)"
// Asünkroonne `actor`-i uuendamine
await cache.updateCache(key: key, value: newData)
return newData
}
func attemptClearCacheAsync() async {
// Asünkroonne väljakutse `actor`-i meetodile
await cache.clearCacheIsolated()
}
func attemptClearCacheDirect() {
// Kogemata kompilaatoriviga:
// `actor`-i isoleeritud eksemplari meetod `clearCacheIsolated()` ei saa kutsuda mitte-isoleeritud kontekstist
// cache.clearCacheIsolated()
}
}
Selles näites:
- Meetodid
updateCachejacachedDatatoimivadDataCache-i isoleeritud kontekstis ning on saadaval sünkroniseeritultactor-i sees. - Kutsed
cache.cachedData(forKey: key)jacache.updateCache(key: key, value: newData)loadDatameetodist (mis asub väljaspoolactor-i konteksti) nõuavadawaitsõna, mis tähistab asünkroonset täitmist ja asünkroonse täitja kasutamist.actor-i täitja vastutab nende operatsioonide järjekorras täitmise eest, tagades eksklusiivse juurdepääsuactor-i olekule. - Meetod
clearCacheIsolatedon märgitud kuinonisolated, kuid sellele on samuti võimalik teha asünkroonne väljakutseawait cache.clearCacheIsolated()väljaspoolactor-i, kuigi see pole selles olukorras kohustuslik (sest see meetod ei muudaactor-i olekut). - Otse sünkrooniline väljakutse
cache.clearCacheIsolated()mitte-isoleeritud kontekstist (naguattemptClearCacheDirect) põhjustab kompilaatorivea, kinnitades asünkroonse juurdepääsu vajadust.
Seega, ohutuks suhtlemiseks actor-iga väljaspool selle konteksti on vajalik kasutada asünkroonseid väljakutseid, mis täidetakse asünkroonse täitja abil, mida juhib ise actor.