如何在 Swift 6 中实现并发安全的静态变量?

问题描述 投票:0回答:1

我正在开发一个 Swift 6 项目,需要管理一个存储网络响应的静态变量。当前的实现不是并发安全的,因为多个线程可以访问和修改共享状态,从而导致竞争条件。之前这段代码可以在 Swift 4 上运行。

extension NetworkRequestHandler {
// Basic static variable with concurrency issues
static private var cachedResponses: [NetworkResponse] = []

// Adding a response
static func addResponse(_ response: NetworkResponse) {
    cachedResponses.append(response)
}

// Removing all responses
static func clearResponses() {
    cachedResponses.removeAll()
}
}


private extension NetworkRequestHandler {
    // Helper function to retrieve the response for a specific request
    static func response(for request: URLRequest) -> NetworkResponse? {
        return cachedResponses.first { $0.url == request.url }
    }
}

所以基本上问题出在这部分代码

static private var cachedResponses: [NetworkResponse] = []
,有错误 - 静态属性“cachedResponses”不是并发安全的,因为它是非隔离的全局共享可变状态

ios swift swift6
1个回答
0
投票

您可以使用演员代替静态属性

actor ResponseCache {
    private var cachedResponses: [NetworkResponse] = []

    func addResponse(_ response: NetworkResponse) {
        cachedResponses.append(response)
    }

    func clearResponses() {
        cachedResponses.removeAll()
    }

    func get(_ url: URL) -> NetworkResponse? {
        cachedResponses.first { $0.url == url }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.