Ios 与NSManagedObject';在UITableView的第二个显示器上显示故障

Ios 与NSManagedObject';在UITableView的第二个显示器上显示故障,ios,core-data,nsmanagedobject,Ios,Core Data,Nsmanagedobject,我正在解析一组数据并将其映射到核心数据NSManagedObjects。我将它们传递到NSArray中的UITableViewController,我将其用作数据源 NSManagedObjects通常通过关系链接到其他NSManagedObjects。大多数通过关系链接的实体都有我需要显示的内容(取决于关系)。最初,UITableView显示的内容没有问题。一旦我开始滚动并且单元格被重新使用,或者如果我滚动回相同的位置,单元格将是空白的(我现在正在调试,所以只将内容显示为字符串) 我正在记录N

我正在解析一组数据并将其映射到
核心数据
NSManagedObject
s。我将它们传递到
NSArray
中的
UITableViewController
,我将其用作
数据源

NSManagedObject
s通常通过关系链接到其他
NSManagedObject
s。大多数通过关系链接的实体都有我需要显示的内容(取决于关系)。最初,
UITableView
显示的内容没有问题。一旦我开始滚动并且单元格被重新使用,或者如果我滚动回相同的位置,单元格将是空白的(我现在正在调试,所以只将内容显示为字符串)

我正在记录NSManagedObject,并在滚动之前获取以下信息:

<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>";
})
(实体:NewPost;id:0xd5dcc60;
数据:{
group=“0xd5b7a50”;
NewPostAttribute text=“0xd5e78d0”;
newPostSection=“0xe85cc70”;
newPostCreator=“0xd297050”;
})
滚动并显示同一对象时,我会在日志中看到以下内容:

<NewPost: 0xd5dcc00> (entity: NewPost; id: 0xe8b3cc0 <x-coredata://3DE41B33-C64E-44C4-9F86-98DF3C6AD700/NewPost/p75> ; 
data: <fault>)
(实体:NewPost;id:0xe8b3cc0;
数据:)
当我需要重新使用单元格或重新显示相同的数据时,为什么关系会出现故障


谢谢

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

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

试试看

当一个单元格从屏幕上滚下然后又重新打开时,我的表格会出现一些奇怪的问题。我通常的解决办法是不重复使用细胞。请注意,如果您尝试对非常大的表执行此操作,可能会有一些性能损失。我在上面使用过的表的大小从来没有超过屏幕的两倍,我也从来没有注意到任何性能滞后,但我会想象如果您使用100行或其他一些行,您可能会遇到麻烦

如果你想走这条路,总体思路是:

  • viewDidLoad
    调用一个新方法(或类似方法),该方法为整个表格创建所有单元格(屏幕上和屏幕下)-此方法通常与最初在
    cellforrowatinexpath中执行的操作非常相似
  • 在制作时将单元格放入
    NSMutableArray
    ivar
  • cellforrowatinexpath
    中,只需从该数组返回单元格即可
这可能不是一个理想的解决方案,但在过去,当我的细胞被重复使用时出现行为异常时,它对我非常有效

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

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

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

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

    例如,当您有一个上下文M(与主队列相关联的主上下文),其父上下文是根上下文(M->root),在这里处理持久性存储时,就需要执行上述操作。然后,从不同的上下文B(B->root)中删除对象并持久保存。现在,可以删除主上下文中的对象,但它们在该上下文中仍然作为“已注册”的托管对象存在,但都是错误。获取上下文M(主上下文),以便更新它

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

  • 注意:当使用MagicalRecord时,您可能会得到一个核心数据堆栈,其中“默认上下文”处理持久存储,并与主线程关联。子上下文将在专用队列上执行,并将主上下文设置为其父上下文。嗯,这是次优


    还可以在此处查看如何处理托管对象。

    能否确认每个托管对象的上下文都与主线程(线程限制)或主队列相关联?另外,您是否将对象提取到上下文中?好的,可以有一个上下文a,其父上下文是主上下文,其父上下文是根上下文(a->main->root),然后从另一个上下文B(B->root)中删除对象并持久保存它。现在,上下文A中的对象可能会被删除,但它们在该上下文中仍然作为“已注册”的托管对象存在,但都是错误。获取上下文A,以便更新它。啊,谢谢。看起来这是一个与上下文有关的问题。我正在使用MagicalRecord并愚蠢地使用了
    saveWithBlock:
    ,当然,我将所有对象放入数组中,然后将其分派到主线程,从而导致故障发生。如果你回答这个问题,我将欣然接受。我将试着制定一个答案嗯,您应该在表视图中重用单元格。我建议找出真正的问题并加以解决感谢您如此详细的回答,希望能帮助其他人。这确实是一个与上下文有关的问题!