Middle
ამ შემთხვევაში საჭიროა ასინქრონული აღმასრულებლის გამოყენება?
sobes.tech AI
პასუხი AI-სგან
ඔව්, එය අවශ්ය වේ.
බාහිර සන්දර්භයකින් (මෙම අවස්ථාවේ ගෝලීය සන්දර්භයෙන්) actor වෙත ප්රවේශ වීමේදී, කොම්පයිලර් එක තනි-සම්බන්ධතා ආරක්ෂාව සහතික කරයි, අසින්ක්රෝන ප්රවේශය ඉල්ලා සිටී.
// ප්රදර්ශනීය ප්රොටෝකෝලය
protocol DataFetcher {
func fetchData() async -> String
}
actor DataCache {
var cache: [String: String] = [:]
func updateCache(key: String, value: String) {
cache[key] = value // `actor`-ගේ තනි-සන්දර්භයේ ක්රියාත්මක වේ
}
func cachedData(forKey key: String) -> String? {
return cache[key] // `actor`-ගේ තනි-සන්දර්භයේ ක්රියාත්මක වේ
}
nonisolated func clearCacheIsolated() {
// මෙම ක්රියාව `nonisolated` ලෙස සලකුණු කර ඇත, එය `actor`-ගේ තත්වයට ප්රවේශ නොමැත
// ප්රවේශය සඳහා අසින්ක්රෝන ඇමතුමක් අවශ්ය වේ
}
}
class DataLoader {
let cache: DataCache // `actor`-ට යොමු
init(cache: DataCache) {
self.cache = cache
}
func loadData(key: String) async -> String {
// අසින්ක්රෝන `actor` වෙත ප්රවේශය
if let cached = await cache.cachedData(forKey: key) {
return cached
}
// ... දත්ත බාගත කිරීමේ තර්කය ...
let newData = "Data for \(key)"
// අසින්ක්රෝන `actor` යාවත්කාලීන කිරීම
await cache.updateCache(key: key, value: newData)
return newData
}
func attemptClearCacheAsync() async {
// `actor`-ට පිටත අසින්ක්රෝන ඇමතුම
await cache.clearCacheIsolated()
}
func attemptClearCacheDirect() {
// කොම්පයිලර් දෝෂය:
// `actor`-ගේ තනි-සන්දර්භිත `clearCacheIsolated()` ක්රියාව
// නො-තනි-සන්දර්භිත සන්දර්භයෙන් ඇමතුමක් නොකළ හැක
// cache.clearCacheIsolated()
}
}
මෙම උදාහරණයේ:
updateCacheසහcachedDataක්රියාවලිDataCache-ගේ තනි-සන්දර්භිත සන්දර්භයේ ක්රියාත්මක වේ, සහ සින්ක්රෝනව ලෙසactor-අතුළත ලබා ගත හැක.cache.cachedData(forKey: key)සහcache.updateCache(key: key, value: newData)ඇමතුම්loadDataක්රියාවලියෙන් (ඒactor-ගේ සන්දර්භයෙන් පිටත)awaitයතුර අවශ්ය වේ, එය අසින්ක්රෝන ක්රියාත්මක කිරීම සහ අසින්ක්රෝන ක්රියාත්මකකරු භාවිතය සලකයි.actor-ගේ ක්රියාත්මකකරු මෙම මෙහෙයුම් අනුක්රමිකව ක්රියාත්මක කිරීම සඳහා වගකියයි, විශේෂ ප්රවේශය ලබා දීම සඳහා.clearCacheIsolatedක්රියාවnonisolatedලෙස සලකුණු කර ඇත, නමුත් එයටawait cache.clearCacheIsolated()ලෙස අසින්ක්රෝන ඇමතුමක් කළ හැක, එයactor-ට පිටතද, එය අවශ්ය නොවේ (මෙම ක්රියාවactor-ගේ තත්වය වෙනස් නොකරයි).- සෘජු සින්ක්රෝන ඇමතුම
cache.clearCacheIsolated()actor-ට පිටත (උදාහරණයේattemptClearCacheDirectතුළ) දෝෂයක් ඇති කරයි, එය අසින්ක්රෝන ප්රවේශයේ අවශ්යතාවය තහවුරු කරයි.
ඒ අනුව, actor- සමඟ ආරක්ෂිත අන්තර්ක්රියාව සඳහා, එහි සන්දර්භයෙන් පිටත අසින්ක්රෝන ඇමතුම් භාවිතා කළ යුතු අතර, ඒවා අසින්ක්රෝන ක්රියාත්මකකරු මඟින් ක්රියාත්මක කළ යුතුය, එය actor-ය විසින් පාලනය වේ।