Iphone 当返回的对象也可能从持久性存储中删除时,如何处理fetchedResultsController返回的故障对象 在我的简单实验中,fetchedResultsController似乎没有返回有故障的对象。fetchedResultsController是否可以为特定索引路径返回有故障的核心数据对象 下面的示例代码在主线程上运行。假设在“点A”处,后台线程删除并将“获取结果”控制器刚刚返回的对象保存到持久存储区。现在,当我们试图访问dataObject上的属性时,我们会崩溃,因为由于数据已从持久性存储中删除,因此无法实现故障 我看到的一件事是,这种关系更容易出错。因此,在“点A”让我们假设父对象从持久存储中删除。然后,当尝试访问父级上的name属性时,将发生错误,因为无法完成错误 预防此类问题的最佳方法是什么

Iphone 当返回的对象也可能从持久性存储中删除时,如何处理fetchedResultsController返回的故障对象 在我的简单实验中,fetchedResultsController似乎没有返回有故障的对象。fetchedResultsController是否可以为特定索引路径返回有故障的核心数据对象 下面的示例代码在主线程上运行。假设在“点A”处,后台线程删除并将“获取结果”控制器刚刚返回的对象保存到持久存储区。现在,当我们试图访问dataObject上的属性时,我们会崩溃,因为由于数据已从持久性存储中删除,因此无法实现故障 我看到的一件事是,这种关系更容易出错。因此,在“点A”让我们假设父对象从持久存储中删除。然后,当尝试访问父级上的name属性时,将发生错误,因为无法完成错误 预防此类问题的最佳方法是什么,iphone,ios,core-data,Iphone,Ios,Core Data,示例代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = code_for_cell_reuse_here; PersonModelObject *dataObject = (PersonModelObject *)[self.fetchedResultsControl

示例代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = code_for_cell_reuse_here;

    PersonModelObject *dataObject = (PersonModelObject *)[self.fetchedResultsController objectAtIndexPath:indexPath];

        /* Point A */

    cell.textLabel.text = dataObject.name;
    cell.detailTextLabel.text = dataObject.parent.name;

    return cell; 
}

-[NSManagedObject isDeleted]

要回答您问题的另一个方面(希望更有用),
NSFetchedResultsController
应该返回有故障的对象(即已加载的属性),您可以使用NSFetchRequest.RelationshipKeyPaths预处理来预处理故障关系。

您需要注意来自另一个线程的NSManagedObjectContextDidSaveNotification并刷新上下文

这可以同步完成,通过使用performselectornmainthread或使用block阻止主线程更新,避免争用情况


然后,您可以手动或使用refreshFromContextDidSaveNotification:mergeChanges:更新本地托管对象上下文,但是,如果数据量足够大,则最简单的方法可能是在托管对象上下文上调用-reset,在获取的结果控制器上调用-performFetch。

即使进行了此检查,竞争条件仍然存在。特别是在isDeleted检查之后和访问故障属性之前删除dataObject时。True。您可以使用锁,或者更改为其他存储/上下文配置。在iOS 5和Lion中,您可以为此使用嵌套上下文。如果正确处理NSManagedObjectContextDidSaveNotification,是否可以保证NSFetchedResultsController返回的对象不会出错?否,确保获取的结果控制器不会返回错误的唯一方法是将-returnsObjectsAsFaults设置为NO。下面给出的另一个答案是,您还可以使用RelationshipKeyPaths预处理来指示应获取某些关系,而不是将其设置为faulted。