Core Data <故障> 使用一次后
Posted
技术标签:
【中文标题】Core Data <故障> 使用一次后【英文标题】:Core Data <Fault > after use one time 【发布时间】:2016-05-03 14:09:25 【问题描述】:我搜索了几个小时,但没有找到任何东西
我在Core Data
中处于有线状态获取对象的方法
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)
[(实体:剧院;ID:0x7bf67a00;数据: 地址=伊斯康; 城市 = 艾哈迈达巴德; ID = 1; isFav = 1; 名称 = PVR; ), (实体: 剧院; id: 0x7bf5ee60 ; 数据: 地址=“普拉德纳加尔”; 城市 = 艾哈迈达巴德; ID = 2; isFav = 0; 名称 = 电影院; ), (实体: 剧院; id: 0x7bf5ee70 ; 数据: 地址 = "新地址"; 城市=拉杰科特; ID = 3; isFav = 0; name = "蓝色游戏"; ), (实体: 剧院; id: 0x7bf5ee80 ; 数据: 地址=“新伊斯康”; 城市 = 波尔班达尔; ID = 4; isFav = 1; 名称 = JaiHind; ), (实体: 剧院; id: 0x7bf55120 ; 数据: 地址=“新地址”; 城市=孟买; ID = 5; isFav = 0; 名称=“戏剧”; ), (实体: 剧院; id: 0x7bf55130 ; 数据: 地址=“维杰4路”; 城市 = 艾哈迈达巴德; ID = 6; isFav = 1; 名称 = PVR; ), (实体: 剧院; id: 0x7bf55140 ; 数据: 地址=“马哈维尔纳加尔”; 城市=德里; ID = 7; isFav = 0; 名称 = 电影院; ), (实体: 剧院; id: 0x7bf28570 ; 数据: 地址=伊斯康; 城市 = 艾哈迈达巴德; ID = 8; isFav = 0; name = "广角"; )]
这个方法是从 viewDidLoad 调用的 之后我重新加载 tableview
Tableview cellForRow 中没有任何内容
为标题标签设置值的一行 一切都很好
然后在我只是滚动 tableview 或选择 tableview 之后
然后我打印
FAULT 作为数据值
我阅读了理论,发现它只是占位符,但我无法获取它
请帮助我为什么它第一次显示数据然后显示故障
我已经fetchReq.returnsObjectsAsFaults = false
提前致谢
【问题讨论】:
【参考方案1】:通常不需要担心故障(CoreData 会在您访问其任何属性时自动触发故障并填充对象)。
但在这种情况下,我怀疑正在发生更邪恶的事情:DataController
在该 fetchAllCoreData
方法中本地实例化,我担心一旦该方法被释放(连同相关的 managedObjectContext
)完成。因此,您的返回数组包含来自已被释放的上下文的 NSManagedObjects。要检查,请尝试将 moc
设为属性而不是局部变量。这应该足以保持对上下文的永久引用(这反过来将对底层堆栈具有强引用)并防止它被释放。
从长远来看,您应该考虑为 DataController
本身设置一个属性,并将其设为单例以便您可以从任何视图控制器访问它,或者将其从视图控制器传递到视图控制器。
【讨论】:
【参考方案2】:我遇到了同样的问题。我正在从数据库中获取数据(并将其保存到本地数组),然后填充一个表。几秒钟后,如果我点击任何内容,应用程序就会崩溃。到那时所有的 NSManagedObjects 都出现了故障。
问题是,我在成功响应之间和之间调用了一个 api,我正在删除数据库中的所有对象并从 api 响应中添加新内容。由于 NSManagedObjects 是动态呈现的,因此我用来填充表的本地数组中的旧数据出现故障。
如果有人遇到此类问题,请先尝试设置:
urRequest.returnsObjectsAsFaults = false
如果这没有帮助,只需检查您是否正在修改数据库(即,在第一次获取之后)。
【讨论】:
取数据到数组后检查是否修改数据库即可。 fetchReq.returnsObjectsAsFaults = false 通过设置解决以上是关于Core Data <故障> 使用一次后的主要内容,如果未能解决你的问题,请参考以下文章
从内存存储中删除 Core Data 对象会将它们变成故障,但不会擦除它们