我有一个CoreData数据库,其中有6行。
在ViewController中,数据显示在一个UITable中,当我在表中选择一行时,didSelectRow列出6行。这是所有的行。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
caches = CoreData.getCaches()
print ("Amount (caches.count)") // gives 6
performSegue(withIdentifier: "Select", sender: nil)
}
当Segue被执行时,prepareForSegue被执行。现在,同样的命令得到的值是7。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
caches = CoreData.getCaches()
print ("Amount (caches.count)") // gives 7
}
我怀疑后台发生了什么事,但我不知道是什么。下面是静态方法供参考:
static func getCaches() -> [Caches] {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var resultArray: [Caches] = []
let request = NSFetchRequest<Caches>(entityName: "Caches")
request.returnsObjectsAsFaults = false
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors
do {
resultArray = try context.fetch(request)
} catch {
print("Error - (error)")
}
return resultArray
}
我找了好久才找到。
执行一个performSegueWithIdentifier。它在调用ViewController中调用prepareForSegue。但显然在此之前,从称为VC的变量/属性被创建。(如果你仔细想想,这是合乎逻辑的)
在调用的VC中,用以下代码初始化了一个变量(从网上抄来的)
var cache = Caches((context: (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext))
这行代码引起了问题。因为它在persistentContainer中创建了一个实体(而不是写入实际的CoreData)。我把它替换成一个普通的:
var cache = Caches()
现在一切正常。谢谢您的支持。