Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSManagedObject集合属性在一段时间后变为零_Swift_Macos_Cocoa_Nsmanagedobject - Fatal编程技术网

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
块是无意义的,因为获取是同步的,这意味着它仍在等待。