Middle
Vai šajā gadījumā ir nepieciešams izmantot asīnhrono izpildītāju?
sobes.tech AI
Atbilde no AI
Jā, tas ir nepieciešams.
Kad piekļūtu actor no ārēja izolēta konteksta (šajā gadījumā no globālā konteksta), kompilators garantē pavedienu drošību, pieprasot asinhronu piekļuvi.
// Demonstrācijas protokols
protocol DataFetcher {
func fetchData() async -> String
}
actor DataCache {
var cache: [String: String] = [:]
func updateCache(key: String, value: String) {
cache[key] = value // Darbojas `actor` izolētā kontekstā
}
func cachedData(forKey key: String) -> String? {
return cache[key] // Darbojas `actor` izolētā kontekstā
}
nonisolated func clearCacheIsolated() {
// Šī funkcija ir atzīmēta kā nonisolated un tai nav piekļuves `actor` stāvoklim
// Piekļuvei ir nepieciešama asinhrona izsaukšana
}
}
class DataLoader {
let cache: DataCache // Atsauce uz `actor`
init(cache: DataCache) {
self.cache = cache
}
func loadData(key: String) async -> String {
// Asinhrona piekļuve `actor`
if let cached = await cache.cachedData(forKey: key) {
return cached
}
// ... datu ielādes loģika ...
let newData = "Data for \(key)"
// Asinhrona `actor` atjaunināšana
await cache.updateCache(key: key, value: newData)
return newData
}
func attemptClearCacheAsync() async {
// Asinhrona izsaukšana `actor` metodes no ārpuses
await cache.clearCacheIsolated()
}
func attemptClearCacheDirect() {
// Kompilatora kļūda:
// `actor` izolēta instances metode `clearCacheIsolated()` nevar tikt izsaukta no ne-izolēta konteksta
// cache.clearCacheIsolated()
}
}
Šajā piemērā:
- Metodes
updateCacheuncachedDatatiek izpildītasDataCacheizolētajā kontekstā un ir pieejamas sinhroniactoriekšienē. - Izsaukumi
cache.cachedData(forKey: key)uncache.updateCache(key: key, value: newData)noloadDatametodes (kas atrodas ārpusactorkonteksta) prasaawaitvārdu, kas norāda uz asinhronu izpildi un asinhrona izpildītāja izmantošanu.actorizpildītājs ir atbildīgs par šo operāciju izpildi secībā, nodrošinot ekskluzīvu piekļuviactorstāvoklim. - Metode
clearCacheIsolatedir atzīmēta kānonisolated, bet tai arī ir pieejama asinhrona izsaukšanaawait cache.clearCacheIsolated()no ārpusesactor, lai gan tas nav obligāti šajā gadījumā (jo šī metode nemainaactorstāvokli). - Tieša sinhrona izsaukšana
cache.clearCacheIsolated()no ne-izolēta konteksta (kāattemptClearCacheDirect) izraisa kompilatora kļūdu, apstiprinot asinhronas piekļuves nepieciešamību.
Tādējādi, drošai mijiedarbībai ar actor no tā konteksta ir nepieciešams izmantot asinhronas izsaukumus, kas tiek veikti ar asinhrona izpildītāja palīdzību, ko pārvalda pats actor.