我正在开发一个 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”不是并发安全的,因为它是非隔离的全局共享可变状态
您可以使用演员代替静态属性
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 }
}
}