@StateObject和@ObservedObject的区别

@ObservedObject创建的对象,会在View重绘的时候重新创建。@StateObject创建的对象不会,只会创建一次,所以在视图重建的时候不会受到影响。

比如

@ObservedObject var downloader = Downloader()
// ...
@StateObject var downloader = Downloader()

VStack {
    ProgressView(value: downloader.progress.fractionCompleted)
        .progressViewStyle(LinearProgressViewStyle())
    Text("\(Int(downloader.progress.fractionCompleted * 100))%")
    Button(action: {
        downloader.cancelDownload()
        isDownloading = false
    }) {
        Text("Cancel")
    }
}

上面的代码中,如果使用@ObservedObject的话,就有很大几率因为视图重绘导致丢失下载进度和无法取消下载任务。换为@StateObject后就可以正常显示下载进度和取消任务。