核心数据<故障>使用一次后

时间:2016-05-03 14:09:25

标签: ios swift 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)

[(entity:Theater; id:0x7bf67a00; data:{     地址= Iskon;     城市=艾哈迈达巴德;     id = 1;     isFav = 1;     name = PVR; }),(entity:Theater; id:0x7bf5ee60; data:{     地址=&#34; Prahladnagar&#34 ;;     城市=艾哈迈达巴德;     id = 2;     isFav = 0;     name = Cinemex; }),(entity:Theater; id:0x7bf5ee70; data:{     地址=&#34;新地址&#34 ;;     city = Rajkot;     id = 3;     isFav = 0;     name =&#34; Blue Game&#34 ;; }),(entity:Theater; id:0x7bf5ee80; data:{     地址=&#34;新的ISKON&#34 ;;     city = Porbandar;     id = 4;     isFav = 1;     name = JaiHind; }),(entity:Theater; id:0x7bf55120; data:{     地址=&#34;新地址&#34 ;;     city =孟买;     id = 5;     isFav = 0;     name =&#34; Drama&#34 ;; }),(entity:Theater; id:0x7bf55130; data:{     地址=&#34; Vijay 4 Road&#34 ;;     城市=艾哈迈达巴德;     id = 6;     isFav = 1;     name = PVR; }),(entity:Theater; id:0x7bf55140; data:{     地址=&#34; Mahavir Nagar&#34 ;;     city =德里;     id = 7;     isFav = 0;     name = Cinemex; }),(entity:Theater; id:0x7bf28570; data:{     地址= Iskon;     城市=艾哈迈达巴德;     id = 8;     isFav = 0;     name =&#34;广角&#34 ;; })]

从viewDidLoad调用此方法 之后我重新加载tableview

Tableview cellForRow

中没有任何内容

将一行设置为标题标签 并且都显示良好

然后我只是滚动tableview或选择tableview

然后我打印

FAULT 作为数据值

我阅读理论并发现它只是占位符但我无法获取

请帮我解释为什么它首次显示数据然后显示错误

我已经fetchReq.returnsObjectsAsFaults = false

先谢谢

2 个答案:

答案 0 :(得分:5)

通常不需要担心故障(CoreData会在您访问其任何属性时自动触发故障并填充对象)。

但是在这个例子中我怀疑发生了更为邪恶的事情:DataControllerfetchAllCoreData方法中被本地实例化,我担心它被解除分配(与相关的managedObjectContext一起)一旦方法完成。因此,返回数组包含已释放的上下文中的NSManagedObjects。要检查,请尝试使moc属性而不是局部变量。这应该足以保持对上下文的永久引用(反过来将对底层堆栈进行强引用)并防止它被释放。

从长远来看,您应该考虑为DataController本身设置一个属性,并将其设为单个,以便您可以从任何视图控制器访问它,或者将它从视图控制器传递给视图控制器。

答案 1 :(得分:1)

我遇到了同样的问题。我从数据库中获取数据(并将其保存到本地数组),然后填充表。如果我点击任何内容,几秒钟后,该应用程序崩溃了。到那时,所有NSManagedObject都出了问题。

问题是,我在中间和成功响应之间调用api,我正在删除数据库中的所有对象并从api响应中添加新内容。由于NSManagedObjects是动态呈现的,因此我用来填充表的本地数组中的旧数据出现了错误。

如果有人遇到此类问题,请先尝试设置:

urRequest.returnsObjectsAsFaults = false 

如果这没有帮助,只需检查您是否在中间修改数据库(即;首次提取后)。