【发布时间】:2020-05-31 22:07:04
【问题描述】:
在进一步研究后,我重新设计了这个问题,并回应 cmets 它太长了。
我正在使用 CodableCSV 从三个 URL 下载和解码 CSV 格式的数据,并且我已经能够确认我收到了我期望的所有数据(截至今天,35027 行)。当数据被解码时,我将一个 NSManagedObjectContext 注入到解码的对象中。这是我的托管对象类:
import Foundation
import CoreData
@objc(MacListEntry)
class MacListEntry: NSManagedObject, Decodable {
//var id = UUID()
@NSManaged var registry: String?
@NSManaged var assignment: String?
@NSManaged var org_name: String?
@NSManaged var org_addr: String?
required convenience init(from decoder: Decoder) throws {
guard let keyManObjContext = CodingUserInfoKey.managedObjectContext,
let context = decoder.userInfo[keyManObjContext] as? NSManagedObjectContext,
let entity = NSEntityDescription.entity(forEntityName: "MacListEntry", in: context) else {
fatalError("Failed to receive managed object context")
}
self.init(entity: entity, insertInto: context)
let container = try decoder.container(keyedBy: CodingKeys.self)
self.registry = try container.decode(String.self, forKey: .registry)
self.assignment = try container.decode(String.self, forKey: .assignment)
self.org_name = try container.decode(String.self, forKey: .org_name)
self.org_addr = try container.decode(String.self, forKey: .org_addr)
}
private enum CodingKeys: Int, CodingKey {
case registry = 0
case assignment = 1
case org_name = 2
case org_addr = 3
}
}
public extension CodingUserInfoKey {
static let managedObjectContext = CodingUserInfoKey(rawValue: "managedObjectContext")
}
然后我尝试使用try context.save() 保存上下文,但在此之前,请检查我尝试使用以下方法插入的记录数:
print("Deleted objects: (self.persistentContainer.viewContext.deletedObjects.count)")
print("Inserted objects: (self.persistentContainer.viewContext.insertedObjects.count)")
print("Has changes: \(self.persistentContainer.viewContext.hasChanges)")
并在每次代码运行时获得不同数量的插入记录 - 总是很短,大约 0.5%。我很难理解在什么情况下以这种方式添加到托管对象上下文的对象不会出现在插入对象列表中,也不会出现在保存的数据库中。一次插入的记录数有实际限制吗?
任何人都可以建议我应该在哪里寻找 - 错误非常小,看起来程序运行良好,但事实并非如此。
非常感谢。
【问题讨论】:
-
在寻求调试帮助时,您的想法是您提供一个minimally reproducible example 以将问题归零。通常情况下,您要么暴露了理解上的差距,要么发现了错误。我怀疑你会让任何人解析所有这些代码。
标签: swift core-data nsurlrequest combine