Rob*_*ert 4 iphone core-data objective-c nsfetchrequest ios
在后台工作的CoreData Apple Docs中,我遇到了一些建议:
例如,您可以将获取请求配置为仅返回对象ID,但也包括行数据(并更新行缓存) - 如果您要将这些对象ID从后台线程传递到另一个线程,这可能很有用.
我想知道你如何实现这个获取请求?具体如何更新行缓存.
我认为这就是获取ID的方式:
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"MyItem"]; // iOS 5 method
request.returnsObjectsAsFaults = YES;
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
Jod*_*ins 14
默认情况下,includesPropertyValues为YES,并且returnsObjectsAsFaults也为YES.
如果您只想返回对象ID,则需要使用...
fetchRequest.resultType = NSManagedObjectIDResultType;
Run Code Online (Sandbox Code Playgroud)
但是,没有要提取的属性,并且不会填充行缓存.您将获得一堆对象ID.
注意,BY DEFAULT,(resultType == NSManagedObjectResultType),因为includesPropertyValues和returnsObjectsAsFaults都是YES,fetch会将对象作为错误返回(对象ID可访问),并且行缓存将被填充 - 但数据不会真正是"在内存中",因为该对象仍然是一个错误...但你仍然可以得到它的对象ID.
您需要做的就是向对象询问其objectID.
所有这些,我想,要说你要求的行为是你默认得到的.那么,你有问题吗,或者你有什么理由认为你没有这种行为?
编辑
嗯...我说,通过默认,你得到了你想要的东西.如果您只是填写一个获取请求,并且不更改任何属性,则returnsObjectsAsFaults为YES - 因此返回给您的对象将是错误.此外,includesPropertyValues也是YES - 因此行缓存中将提供一定数量的属性数据.
您可以通过调用managedObject.objectID来访问objectID属性.
编辑
我道歉,因为我显然没有很好地沟通,因为这将是我第三次说同样的事情.
创建NSFetchRequest时,它具有默认设置的多个属性.
默认情况下,resultType设置为NSManagedObjectResultType.这意味着,除非您更改它,它仍将是NSManagedObjectResultType.它还意味着从获取中获取的结果数组将包含NSManagedObjects数组(而不是返回计数,字典或ObjectID).
returnsObjectsAsFaults默认设置为YES.这意味着,除非你改变它,它仍然是YES.它还意味着从获取返回的对象将是错误.NSManagedObject将无法使用属性数据实现.对象将是一个错误.它将有足够的元数据来知道它的类型,对象ID和其他一些东西.
includesPropertyValues默认设置为YES.这意味着,除非你改变它,它仍然是YES.这也意味着将一些属性数据提取到行缓存中.
从获取返回的每个NSManagedObject将:
这就是你要求的一切.我不确定我还能添加什么(不再重复我自己).
另请注意,如果只需要对象ID,则可以将resultType设置为NSManagedObjectIDResultType.
直接来自NSFetchRequest文档......
includesPropertyValues
您可以将includesPropertyValues设置为NO,以避免创建表示属性值的对象,从而减少内存开销.但是,如果您确定要么不需要实际的属性数据,要么已经拥有行缓存中的信息,那么通常只应该这样做,否则您将多次访问数据库.
在正常提取期间(includesPropertyValues为YES),Core Data获取匹配记录的对象ID和属性数据,使用信息填充行缓存,并将托管对象作为错误返回(请参阅returnsObjectsAsFaults).这些故障是托管对象,但它们的所有属性数据仍驻留在行缓存中,直到触发故障.当故障被触发时,Core Data从行缓存中检索数据 - 无需返回数据库.
如果includesPropertyValues为NO,则Core Data仅提取匹配记录的对象ID信息 - 它不会填充行缓存.Core Data仍然返回托管对象,因为它只需要托管对象ID来创建故障.但是,如果您随后触发了故障,Core Data会在(空)行缓存中查找,找不到任何数据,然后再次返回到存储中以获取数据.
和...
returnsObjectsAsFaults
默认值为YES.如果结果类型(请参阅resultType)是NSManagedObjectIDResultType,则不使用此设置,因为对象ID没有属性值.如果您知道需要从返回的对象访问属性值,则可以将returnsObjectsAsFaults设置为NO以获得性能优势.
默认情况下,执行fetch返回时,对象AsFaults为YES; Core Data获取匹配记录的对象数据,使用信息填充行缓存,并将托管对象作为错误返回.这些故障是受管对象,但它们的所有属性数据都驻留在行高速缓存中,直到触发故障为止.发生故障时,Core Data会从行缓存中检索数据.尽管此操作的开销很小,但对于大型数据集,它可能变得非常重要.如果需要从返回的对象访问属性值(例如,如果迭代所有对象以计算特定属性的平均值),则将returnsObjectsAsFaults设置为NO以避免额外开销会更有效.
让我以简单的方式解释它
默认情况下,NSFetchRequest有
resultType: NSManagedObjectResultType
returnsObjectsAsFaults: YES
includesPropertyValues: YES
Run Code Online (Sandbox Code Playgroud)
这里返回对象(在内存中)只有objectID属性,所有其他属性都是空的(这就是所谓的错误)
includesPropertyValues
YES:表示对象属性位于行缓存(CoreData的一些特殊缓存)中,因此当您访问这些属性时,CoreData将在行缓存中查找它们
NO:表示没有行缓存,当您访问这些属性时,CoreData将再次查询SQLite
returnsObjectsAsFaults
是:允许includesPropertyValues生效(意味着允许出错)
NO:将对象的所有属性返回到内存中
注意:有两种故障:管理对象故障和关系故障
在此处阅读更多故障限制对象图的大小
所以在你的情况下,只需使用默认值
| 归档时间: |
|
| 查看次数: |
5369 次 |
| 最近记录: |