我搜索了几个小时但没找到任何东西
我处于核心数据
的有线情况获取对象的方法
func fetchAllCoreData() -> NSArray? {
let moc = DataController().managedObjectContext
let fetchReq = NSFetchRequest(entityName: "Theater")
var array = [Theater]()
fetchReq.returnsObjectsAsFaults = false
do {
let obj = try moc.executeFetchRequest(fetchReq) as! [Theater]
for var details in obj {
array.append(details)
}
} catch {
print("Error in Fetching")
return nil
}
return array
}
其中 DataController()来自http://www.codebeaulieu.com/10/adding-core-data-using-swift-2
我从fetch得到的值是
po print(self.arrTheater)
[(entity:Theater; id:0x7bf67a00; data:{ 地址= Iskon; 城市=艾哈迈达巴德; id = 1; isFav = 1; name = PVR; }),(entity:Theater; id:0x7bf5ee60; data:{ 地址=" Prahladnagar&#34 ;; 城市=艾哈迈达巴德; id = 2; isFav = 0; name = Cinemex; }),(entity:Theater; id:0x7bf5ee70; data:{ 地址="新地址&#34 ;; city = Rajkot; id = 3; isFav = 0; name =" Blue Game&#34 ;; }),(entity:Theater; id:0x7bf5ee80; data:{ 地址="新的ISKON&#34 ;; city = Porbandar; id = 4; isFav = 1; name = JaiHind; }),(entity:Theater; id:0x7bf55120; data:{ 地址="新地址&#34 ;; city =孟买; id = 5; isFav = 0; name =" Drama&#34 ;; }),(entity:Theater; id:0x7bf55130; data:{ 地址=" Vijay 4 Road&#34 ;; 城市=艾哈迈达巴德; id = 6; isFav = 1; name = PVR; }),(entity:Theater; id:0x7bf55140; data:{ 地址=" Mahavir Nagar&#34 ;; city =德里; id = 7; isFav = 0; name = Cinemex; }),(entity:Theater; id:0x7bf28570; data:{ 地址= Iskon; 城市=艾哈迈达巴德; id = 8; isFav = 0; name ="广角&#34 ;; })]
从viewDidLoad调用此方法 之后我重新加载tableview
Tableview cellForRow
中没有任何内容将一行设置为标题标签 并且都显示良好
然后我只是滚动tableview或选择tableview
然后我打印
FAULT 作为数据值
我阅读理论并发现它只是占位符但我无法获取
请帮我解释为什么它首次显示数据然后显示错误
我已经fetchReq.returnsObjectsAsFaults = false
先谢谢
答案 0 :(得分:5)
通常不需要担心故障(CoreData会在您访问其任何属性时自动触发故障并填充对象)。
但是在这个例子中我怀疑发生了更为邪恶的事情:DataController
在fetchAllCoreData
方法中被本地实例化,我担心它被解除分配(与相关的managedObjectContext
一起)一旦方法完成。因此,返回数组包含已释放的上下文中的NSManagedObjects。要检查,请尝试使moc
属性而不是局部变量。这应该足以保持对上下文的永久引用(反过来将对底层堆栈进行强引用)并防止它被释放。
从长远来看,您应该考虑为DataController
本身设置一个属性,并将其设为单个,以便您可以从任何视图控制器访问它,或者将它从视图控制器传递给视图控制器。
答案 1 :(得分:1)
我遇到了同样的问题。我从数据库中获取数据(并将其保存到本地数组),然后填充表。如果我点击任何内容,几秒钟后,该应用程序崩溃了。到那时,所有NSManagedObject都出了问题。
问题是,我在中间和成功响应之间调用api,我正在删除数据库中的所有对象并从api响应中添加新内容。由于NSManagedObjects是动态呈现的,因此我用来填充表的本地数组中的旧数据出现了错误。
如果有人遇到此类问题,请先尝试设置:
urRequest.returnsObjectsAsFaults = false
如果这没有帮助,只需检查您是否在中间修改数据库(即;首次提取后)。