NSArray与NSManagedObject的关系在UITableView中的第二个显示上出错

时间:2013-12-04 15:46:25

标签: ios core-data nsmanagedobject

我正在解析一堆数据并将其映射到Core Data NSManagedObject。我将这些内容传递给UITableViewController NSArray dataSource,我将其用作NSManagedObject

NSManagedObject经常与其他UITableView关系链接。通过关系链接的大多数实体都有我需要显示的内容(取决于关系)。最初<NewPost: 0xd5dcc00> (entity: NewPost; id: 0xd5dcc60 <x-coredata:///NewPost/t63931035-BB67-467D-8598-CAD8563BA5DC267> ; data: { group = "0xd5b7a50 <x-coredata:///Group/t63931035-BB67-467D-8598-CAD8563BA5DC265>"; newPostAttributedText = "0xd5e78d0 <x-coredata:///AttributedText/t63931035-BB67-467D-8598-CAD8563BA5DC269>"; newPostSection = "0xe85cc70 <x-coredata://3DE41B33-C64E-44C4-9F86-98DF3C6AD700/PostSection/p7>"; newPostCreator = "0xd297050 <x-coredata://3DE41B33-C64E-44C4-9F86-98DF3C6AD700/Person/p9>"; }) 显示内容没问题。一旦我开始滚动并重新使用单元格,或者如果我回滚到同一位置,单元格就是空白(我现在只是调试,所以只显示内容为字符串)。

我在记录NSManagedObject并在滚动之前获取以下内容:

<NewPost: 0xd5dcc00> (entity: NewPost; id: 0xe8b3cc0 <x-coredata://3DE41B33-C64E-44C4-9F86-98DF3C6AD700/NewPost/p75> ; 
data: <fault>)

滚动并显示同一个对象时,我在日志中看到以下内容:

{{1}}

当我需要重新使用单元格或重新显示相同数据时,为什么关系会出错?

由于

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我通过在 NSFetchRequest 对象中设置 NO returnsObjectsAsFaults 属性解决了这个问题:

NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setReturnsObjectsAsFaults:NO];

试试吧!

答案 1 :(得分:1)

  1. 您需要确保每个托管对象的上下文都与主线程(线程限制)或主队列相关联。 (注意:托管对象具有属性managedObjectContext

    如果您访问主线程中的托管对象,例如使用UIKit呈现内容,则它们的托管对象上下文必须分别与主线程和主队列相关联。

    此外,对象及其相关对象只有一个上下文是有意义的。

  2. 此外,您需要确保您的上下文(在本例中为&#34;主要上下文&#34;)实际上是最新的。这意味着,如果需要,您可能需要获取从持久性存储中检索它们的对象,并且它还会更新对象集(使用谓词时)。

    例如,如果您有一个上下文M(与主队列关联的主上下文),其父项是根上下文(M - > root),则处理持久性存储。然后,从不同的上下文B(B-> root)中删除对象并持久保存。现在,上下文Main中的对象可能会被删除但它们仍然存在为&#34;已注册&#34;在该上下文中管理对象,但是是故障。获取上下文M(主上下文),以便更新它。

    注意:您最好使用NSFetchedResultsController来处理更新。

  3. 警告:使用MagicalRecord时,您最终可能会得到一个核心数据堆栈,其中&#34;默认上下文&#34;处理持久性存储,并且还与主线程相关联。子上下文将在私有队列上执行,并将主上下文设置为其父上下文。恕我直言,这不是最理想的。

    还可以看一下SO NSOperation in iOS - How to handle loops and nested NSOperation call to get Images,以便处理托管对象。

答案 2 :(得分:0)

当一个单元格在屏幕上滚动然后重新打开时,我的表格出现了奇怪的问题。我通常的解决方法是不重复使用细胞。请注意,如果您尝试使用非常大的表执行此操作,则可能会有一些性能损失。我使用它的表格从不超过屏幕尺寸的两倍,而且我从未注意到任何性能滞后,但是如果您使用100行或者您可能会遇到麻烦的话,我会进行成像。 / p>

如果你想这样做,一般的想法是:

  • viewDidLoad(或类似的东西)调用一个新方法,为整个表创建所有单元格(在屏幕上和关闭) - 这种方法通常与{{1 }}
  • 将细胞制成cellForRowAtIndexPath ivar。
  • NSMutableArray中,只需从该数组中返回单元格。

这可能不是理想的解决方案,但过去当我的细胞重复使用时行为不当时,它对我很有用。