如何解决Swift发出的警告:无法从Sendable闭包突变主参与者隔离属性

yc0p9oo0  于 2023-03-17  发布在  Swift
关注(0)|答案(1)|浏览(119)

我有一个用Swift开发的应用程序。它运行得很好。最近发布的Swift现在在我的部分代码上显示警告,表明这在Swift 6中无法运行。我不确定解决这个问题的最佳方法。以下是摘录:

@MainActor class ViewModel: ObservableObject {

    private var _http_last_error: String = "--"

    func fetch_cpuinfo() {
        var request = URLRequest(url: _cpuinfo_url!)
        request.httpMethod = "GET"

        // create a dataTask, which includes a closure to process the response
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            // Check for Error
            if let error = error {
                self._http_last_error = error.localizedDescription // WARNING HERE
                return
            }
        }
        task.resume()
    }
}

具体的警告是“主参与者隔离属性”_http_last_error“不能从可发送闭包变化;这是Swift 6”中的错误。我理解为什么会出现此问题;这个任务块中的代码稍后会执行,并且没有对变量进行保护,但是我不知道保护它的最好方法。

gc0ot86w

gc0ot86w1#

使用dataTask的新async/await版本代替

func fetch_cpuinfo() {
    var request = URLRequest(url: _cpuinfo_url!)
    request.httpMethod = "GET"

    Task {
        do {
            let (data, response) = try await URLSession.shared.data(for: request)
            // handle data and response...
        } catch {
            self._http_last_error = error.localizedDescription
        }
    }
}

或者甚至更好地使整个函数异步,

func fetch_cpuinfo() async {
    var request = URLRequest(url: _cpuinfo_url!)
    request.httpMethod = "GET"

    do {
        let (data, _) = try await URLSession.shared.data(for: request)
        // handle data and response...
    } catch {
        self._http_last_error = error.localizedDescription
    }
}

相关问题