Sobes.tech
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-ය විසින් පාලනය වේ।