我正在解析一堆数据并将其映射到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}}
当我需要重新使用单元格或重新显示相同数据时,为什么关系会出错?
由于
答案 0 :(得分:1)
我遇到了同样的问题,我通过在 NSFetchRequest 对象中设置 NO returnsObjectsAsFaults 属性解决了这个问题:
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setReturnsObjectsAsFaults:NO];
试试吧!
答案 1 :(得分:1)
您需要确保每个托管对象的上下文都与主线程(线程限制)或主队列相关联。 (注意:托管对象具有属性managedObjectContext
)
如果您访问主线程中的托管对象,例如使用UIKit呈现内容,则它们的托管对象上下文必须分别与主线程和主队列相关联。
此外,对象及其相关对象只有一个上下文是有意义的。
此外,您需要确保您的上下文(在本例中为&#34;主要上下文&#34;)实际上是最新的。这意味着,如果需要,您可能需要获取从持久性存储中检索它们的对象,并且它还会更新对象集(使用谓词时)。
例如,如果您有一个上下文M(与主队列关联的主上下文),其父项是根上下文(M - > root),则处理持久性存储。然后,从不同的上下文B(B-> root)中删除对象并持久保存。现在,上下文Main中的对象可能会被删除但它们仍然存在为&#34;已注册&#34;在该上下文中管理对象,但是是故障。获取上下文M(主上下文),以便更新它。
注意:您最好使用NSFetchedResultsController
来处理更新。
警告:使用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
中,只需从该数组中返回单元格。这可能不是理想的解决方案,但过去当我的细胞重复使用时行为不当时,它对我很有用。