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:
,当然,我将所有对象放入数组中,然后将其分派到主线程,从而导致故障发生。如果你回答这个问题,我将欣然接受。我将试着制定一个答案嗯,您应该在表视图中重用单元格。我建议找出真正的问题并加以解决感谢您如此详细的回答,希望能帮助其他人。这确实是一个与上下文有关的问题!