目前我了解更多有关 Core Data 的信息,并测试了 Apple 提供的演示代码“Earthquakes - Loading and Display a large Data Feed”。但是现在我遇到了 Canvas View 的问题。每次当我使用提供的 Quake.preview 时编辑器崩溃。
我也尝试阅读崩溃日志,但我不知道是什么导致了这个错误。在 ContentView 中,当我将提供程序从 .preview 更改为 .shared 时,它没有崩溃。
有人知道为什么会这样吗?谢谢
ContentView PreviewProvider:
struct ContentView_Previews: PreviewProvider {
static let quakesProvider = QuakesProvider.preview
static var previews: some View {
ContentView(quakesProvider: quakesProvider)
.environment(\.managedObjectContext,
quakesProvider.container.viewContext)
}
}
/// An earthquake for use with canvas previews.
static var preview: Quake {
let quakes = Quake.makePreviews(count: 1)
return quakes[0]
}
static func makePreviews(count: Int) -> [Quake] {
var quakes: [Quake] = []
let viewContext = QuakesProvider.preview.container.viewContext
for index in 0..<count {
let quake = Quake(context: viewContext)
quake.code = UUID().uuidString
quake.time = Date().addingTimeInterval(Double(index) * -300)
quake.magnitude = .random(in: -1.1...10.0)
quake.place = "15km SSW of Cupertino, CA"
quakes.append(quake)
}
return quakes
}
/// A quakes provider for use with canvas previews.
static let preview: QuakesProvider = {
let provider = QuakesProvider(inMemory: true)
Quake.makePreviews(count: 10)
return provider
}()
之间存在循环依赖
static let preview: QuakesProvider
打电话Quake.makePreviews(count: 10)
和
static func makePreviews(count: Int) -> [Quake]
打电话QuakesProvider.preview
您可以更改为:
static func makePreviews(context: NSManagedObjectContext, count: Int) -> [Quake] {
var quakes: [Quake] = []
for index in 0..<count {
let quake = Quake(context: context)
quake.code = UUID().uuidString
quake.time = Date().addingTimeInterval(Double(index) * -300)
quake.magnitude = .random(in: -1.1...10.0)
quake.place = "15km SSW of Cupertino, CA"
quakes.append(quake)
}
return quakes
}
/// A quakes provider for use with canvas previews.
static let preview: QuakesProvider = {
let provider = QuakesProvider(inMemory: true)
Quake.makePreviews(context: provider.container.viewContext, count: 10)
return provider
}()
/// An earthquake for use with canvas previews.
static var preview: Quake {
let provider = QuakesProvider(inMemory: true)
let quakes = Quake.makePreviews(context: provider.container.viewContext, count: 1)
return quakes[0]
}
同样在
QuakesProvider.swift
中删除初始化程序的 private
访问级别,以便我们可以在 Quake
扩展中使用它:
init(inMemory: Bool = false) { ... }
SwiftUI 预览:
对于
List
或您在 FetchRequest
实体上有 Quake
的任何视图:
struct ContentView_Previews: PreviewProvider {
// Use the in-memory and pre-populated QuakesProvider
static let quakesProvider = QuakesProvider.preview
static var previews: some View {
ContentView(quakesProvider: quakesProvider)
.environment(\.managedObjectContext, quakesProvider.container.viewContext)
}
}
对于
QuakeRow
中的单品:
struct QuakeRow_Previews: PreviewProvider {
static var previews: some View {
// Use the in-memory QuakesProvider to create only 1 item, and returns it
QuakeRow(quake: .preview)
}
}