Swift NSManagedObject集合属性在一段时间后变为零
我在Swift NSManagedObject集合属性在一段时间后变为零,swift,macos,cocoa,nsmanagedobject,Swift,Macos,Cocoa,Nsmanagedobject,我在NSViewController的子类中工作,在viewDidLoad中,我从CoreData获取实体,如下所示: let delegate = AppDelegate.init() let context = delegate.persistentContainer.viewContext let fetch = PicPathEntity.entityFetchRequest() var tempEntities: [PicPathEntity] = [] context.perfor
NSViewController
的子类中工作,在viewDidLoad
中,我从CoreData
获取实体,如下所示:
let delegate = AppDelegate.init()
let context = delegate.persistentContainer.viewContext
let fetch = PicPathEntity.entityFetchRequest()
var tempEntities: [PicPathEntity] = []
context.performAndWait {
tempEntities = try! fetch.execute()
}
entities = tempEntities
然后在itemForRepresentedObjectAt
函数期间,实体的计数似乎相同,但属性值已变为nil
/空
我做了一些搜索,发现了类似的问题,但没有明确的答案(至少对于Swift
)
在我的entities变量中,我似乎找不到有关如何正确获取和保留数据的信息。在阅读了对象和上下文之间的关系如何工作之后,我找到了解决方法 事实证明,我所需要做的就是将上下文变成
ViewController
的属性,而不是viewDidLoad
的局部变量
var entities: [PicPathEntity] = []
var context: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
let delegate = AppDelegate.init()
context = delegate.persistentContainer.viewContext
let fetch = PicPathEntity.entityFetchRequest()
context.performAndWait {
entities = try! fetch.execute()
}
}
由于对该答案的有益评论,我现在已将代码更新为:
var entities: [PicPathEntity] = []
var context: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
let delegate = NSApplication.shared.delegate as! AppDelegate
context = delegate.persistentContainer.viewContext
let fetch = PicPathEntity.entityFetchRequest()
context.perform {
self.entities = try! fetch.execute()
self.picFinderEntityCollectionView.reloadData()
}
configureCollectionView()
}
请注意,
AppDelegate.init()
不会返回脚本中指定的应用程序委托类。这是一个全新的例子。而且一个fetch
无论如何都是同步的。我不知道你这是什么意思。它引用在我的项目中定义的AppDelegate类。是否有其他我应该注意的事项,或者出于任何目的使用不同的方式初始化委托?如果您使用的是情节提要,则它不会引用连接到应用程序委托的AppDelegate
实例。您可以使用let delegate=uiappapplication.shared.delegate as!AppDelegate
您能否详细说明为什么这样做会有好处,以及您关于获取同步的评论在我的代码和意图的上下文中意味着什么?提前感谢您的真正参考。1)如果您创建AppDelegate的新实例,您将获得不同的ManagedObjectContext
s,这可能会导致问题。2) performAndWait
块是无意义的,因为获取是同步的,这意味着它仍在等待。