核心数据地震演示在预览中崩溃

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

目前我了解更多有关 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
    }()
swift swiftui core-data
1个回答
0
投票

之间存在循环依赖

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.