FetchedResults 崩溃:调度队列:com.apple.main-thread (0)



我按照本教程学习了动态过滤器和 CoreData: https://www.hackingwithswift.com/quick-start/ios-swiftui/dynamically-filtering-fetchrequest-with-swiftui

我有以下代码。内容视图.swift

import SwiftUI
struct ContentView: View {
@Environment(.managedObjectContext) var moc
@State var lastNameFilter = "A"
var body: some View {
VStack {
FilteredList(filter: lastNameFilter)
Button("Add Examples") {
let taylor = Singer(context: self.moc)
taylor.firstName = "Taylor"
taylor.lastName = "Swift"
let ed = Singer(context: self.moc)
ed.firstName = "Ed"
ed.lastName = "Sheeran"
let adele = Singer(context: self.moc)
adele.firstName = "Adele"
adele.lastName = "Adkins"
try? self.moc.save()
}
Button("Show A") {
self.lastNameFilter = "A"
}
Button("Show S") {
self.lastNameFilter = "S"
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

已过滤列表.swift

import CoreData
import SwiftUI
struct FilteredList: View {
var fetchRequest: FetchRequest<Singer>
var singers: FetchedResults<Singer> { fetchRequest.wrappedValue }
var body: some View {
List(singers, id: .self) { singer in
Text("(singer.wrappedFirstName) (singer.wrappedLastName)")
}
}
init(filter: String) {
fetchRequest = FetchRequest<Singer>(entity: Singer.entity(), sortDescriptors: [], predicate: NSPredicate(format: "lastName BEGINSWITH %@", filter))
}
}
//struct FilteredList_Previews: PreviewProvider {
//    static var previews: some View {
//    }
//}

歌手+核心数据类.swift

import Foundation
import CoreData
@objc(Singer)
public class Singer: NSManagedObject {
}

歌手+核心数据属性.swift

import Foundation
import CoreData

extension Singer {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Singer> {
return NSFetchRequest<Singer>(entityName: "Singer")
}
@NSManaged public var firstName: String?
@NSManaged public var lastName: String?
var wrappedFirstName : String {
firstName ?? "Unknown"
}
var wrappedLastName : String {
lastName ?? "Unknown"
}
}

核心数据有 1 个实体:具有 2 个字符串属性的歌手:名字和姓氏。模块:当前产品模块。代码:手动/无。

当我尝试预览内容视图时,预览崩溃。当我打开崩溃日志文件并转到调试导航器时,我可以看到以下错误:

调度队列: com.apple.main-thread (0(

在线上:

已过滤列表.swift

var singers: FetchedResults<Singer> { fetchRequest.wrappedValue }
List(singers, id: .self) { singer in

应用委托.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

可能是什么问题?包装值?代码有什么问题?

编辑: 以下是我的 Dropbox 上的崩溃日志文件的链接: 崩溃日志

帮助我的是将结构ContentView_Previews(...(更改为:

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
return ContentView().environment(.managedObjectContext, context)
}
}

我还将结构FilteredList_Previews(...(更改为:

struct FilteredList_Previews: PreviewProvider {
static var previews: some View {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
return FilteredList(filter: "A").environment(.managedObjectContext, context)
}
}

感谢@Gergely,因为他在这里帮助我解决了类似的问题:https://stackoverflow.com/a/59629730/12315994

我也有同样的场景。提供从AppDelegate到预览的上下文,并向我添加数据以修复崩溃:

struct FilteredList_Previews: PreviewProvider {
static var previews: some View {
let moc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let taylor = Singer(context: moc)
taylor.firstName = "Taylor"
taylor.lastName = "Swift"
return FilteredList().environment(.managedObjectContext, moc)
}
}

不幸的是,数据没有显示我期望的确切数据(它显示了重复的条目(。但对我来说,预览视图的设计就足够了。 希望仍然有帮助。

相关内容

最新更新