CoreData总是尊重returnObjectsasFaults吗? [英] Does CoreData always respect returnObjectsasFaults?

查看:198
本文介绍了CoreData总是尊重returnObjectsasFaults吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在以下代码中,我将returnObjectsasFaults显式设置为false。然后RIGHT后的请求我检查,看看对象是否故障。 NSAssert失败。



也许是因为对象是一个imageBlob。也许我错过了什么?我只是想确认。



这是一个小问题。如果我摆脱nsassert,那么我的程序将无论如何运行。仍然会吸。

  +(NSFetchRequest *)fetchRequestInContext:(NSString *)entityName:(NSPredicate *)predicate: )sortKey:(BOOL)sortAscending 
{
// NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[BGMDCRManagedObjectContextThreadHandler managedObjectContext]];
[request setEntity:entity];

if(predicate!= nil)
{
[request setPredicate:predicate];
}

if(sortKey!= nil)
{
NSMutableArray * sortDescriptorArray = [self getMoreSearchDescriptorsForEntity:entityName];
[request setSortDescriptors:sortDescriptorArray];
}

//request.fetchLimit = 200; //可以覆盖别的地方
request.returnsObjectsAsFaults = false;
if(entityName == BusinessString)
{
request.relationshipKeyPathsForPrefetching = arrayRelationship;
}

// [request setIncludesSubentities:<#(BOOL)#>
return request;
}

+(NSArray *)searchObjectsInContextEntityName:(NSString *)entityName谓词:(NSPredicate *)谓词SortKEy:(NSString *)sortKey Booelan:(BOOL)sortAscending
{
NSManagedObjectContext * moc = [BGMDCRManagedObjectContextThreadHandler managedObjectContext];
NSFetchRequest * request = [self fetchRequestInContext:entityName:predicate:sortKey:sortAscending];

NSError * error;

if(entityName == BusinessString)
{
error = nil; //一些断点代码
}

NSArray * fetchedObjects = [moc executeFetchRequest:request error:& error];

for(NSManagedObject * mo in fetchedObjects){
NSAssert(!mo.isFault,@由于某种原因mo是故障);
}

return fetchedObjects;
}


解决方案

问题,同时操作一个子NSManagedObjectContext。我创建一个如下

  NSManagedObjectContext * workerMOC = nil; 
workerMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerMOC.parentContext = self.moc; //这是我的主要NSManagedObjectContext

现在之后,如果我这样做:



<$ c $ p> [workerMOC performBlock:^ {
NSFetchRequest * fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@Company];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSArray * allCompanies = [workerMOC executeFetchRequest:fetchRequest error:nil];
}];

我在所有公司都有问题。



但是,如果我使用了自己的fetch请求,我会得到适当的预取结果。方法如下:

  [workerMOC performBlock:^ {
NSFetchRequest * fetchRequest = [[[NSFetchRequest alloc] init] autorelease ];
fetchRequest.entity = [NSEntityDescription entityForName:@CompanyinManagedObjectContext:workerMOC];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSArray * allCompanies = [workerMOC.persistentStoreCoordinator executeRequest:fetchRequest
withContext:workerMOC
error:nil];
}];

所以似乎是这样,在NSManagedObjectContexts上获取直接绑定到NSPersistentStoreCoordinator工作正常。但是在子NSManagedObjectContexts的情况下,它不直接绑定到存储,而是绑定到父上下文,不要按预期行为。
我在苹果文档中找不到与此事相关的任何东西,但仍然不认为这是一个错误。


In the following code, I explicitly set returnObjectsasFaults as false. Then RIGHT after the request I check to see if objects are fault or not. NSAssert fail.

Perhaps it's because the object is an imageBlob. Perhaps I am missing something? I just want to make sure.

This is a minor issue. If I get rid the nsassert, then my programs will run anyway. Still it sucks.

+(NSFetchRequest * )fetchRequestInContext:(NSString*) entityName:(NSPredicate *) predicate:(NSString*) sortKey:(BOOL) sortAscending
{
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[BGMDCRManagedObjectContextThreadHandler managedObjectContext]];
    [request setEntity:entity];

    if(predicate != nil)
    {
        [request setPredicate:predicate];
    }

    if(sortKey != nil)
    {
        NSMutableArray * sortDescriptorArray =[self getMoreSearchDescriptorsForEntity:entityName];
        [request setSortDescriptors:sortDescriptorArray];
    }

    //request.fetchLimit = 200; //can be overridden somewhere else
    request.returnsObjectsAsFaults = false;
    if (entityName == BusinessString)
    {
        request.relationshipKeyPathsForPrefetching = arrayRelationship;
    }

    //[request setIncludesSubentities:<#(BOOL)#>
    return request;
}

+(NSArray *) searchObjectsInContextEntityName:(NSString*) entityName Predicate:(NSPredicate *) predicate SortKEy:(NSString*) sortKey Booelan:(BOOL) sortAscending 
{
    NSManagedObjectContext * moc =[BGMDCRManagedObjectContextThreadHandler managedObjectContext];
    NSFetchRequest *request = [self fetchRequestInContext:entityName:predicate:sortKey:sortAscending];

    NSError *error;

    if (entityName==BusinessString)
    {
        error=nil; //Some code for breakpoint
    }

    NSArray *fetchedObjects = [moc executeFetchRequest:request error:&error];

    for (NSManagedObject * mo in fetchedObjects) {
        NSAssert(!mo.isFault, @"For some reason mo is fault");
    }

    return fetchedObjects;
}

解决方案

I've encountered the same problem while operating on a child NSManagedObjectContext. I create one as follows

NSManagedObjectContext *workerMOC = nil;
workerMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerMOC.parentContext = self.moc; // this is my main NSManagedObjectContext

Now after that if I do:

[workerMOC performBlock:^{
  NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Company"];
  [fetchRequest setReturnsObjectsAsFaults:NO];
  NSArray *allCompanies = [workerMOC executeFetchRequest:fetchRequest error:nil];
}];

I get faults in allCompanies. Which of course, just to clarify, does not happen if I execute the fetch request on self.moc.

However, I get appropriate pre-fetched results if I use the approach below:

[workerMOC performBlock:^{
  NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
  fetchRequest.entity = [NSEntityDescription entityForName:@"Company" inManagedObjectContext:workerMOC];
  [fetchRequest setReturnsObjectsAsFaults:NO];
  NSArray *allCompanies = [workerMOC.persistentStoreCoordinator executeRequest:fetchRequest
                                                                   withContext:workerMOC
                                                                         error:nil];
}];

So it seems to be the case, that fetching on NSManagedObjectContexts tied directly to the NSPersistentStoreCoordinator works just fine. But in case of child NSManagedObjectContexts, which are not tied directly to the store, but rather to the parent context, do not behave as expected. I could not find anything related to this matter in the Apple docs, but still, I don't think it's a bug.

这篇关于CoreData总是尊重returnObjectsasFaults吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆