作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在下面的代码中,我明确地将 returnObjectsasFaults 设置为 false。然后在请求之后立即检查对象是否有故障。 NSAssert 失败。
可能是因为对象是一个 imageBlob。也许我错过了什么?我只是想确定一下。
这是一个小问题。如果我去掉 nsassert,那么我的程序无论如何都会运行。还是很烂。
+(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;
}
最佳答案
我在操作子 NSManagedObjectContext 时遇到了同样的问题。我创建一个如下
NSManagedObjectContext *workerMOC = nil;
workerMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerMOC.parentContext = self.moc; // this is my main NSManagedObjectContext
如果我这样做之后:
[workerMOC performBlock:^{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Company"];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSArray *allCompanies = [workerMOC executeFetchRequest:fetchRequest error:nil];
}];
我在所有公司都犯过错误。当然,澄清一下,如果我在 self.moc 上执行获取请求,则不会发生这种情况。
但是,如果我使用以下方法,我会得到适当的预取结果:
[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];
}];
看来是这样的,直接绑定(bind)到 NSPersistentStoreCoordinator 的 NSManagedObjectContexts 上的获取工作得很好。但是如果子 NSManagedObjectContexts 不直接绑定(bind)到存储,而是绑定(bind)到父上下文,则不会按预期运行。我在 Apple 文档中找不到与此事相关的任何内容,但我仍然不认为这是一个错误。
关于objective-c - CoreData 是否始终尊重 returnObjectsasFaults?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12780509/
在下面的代码中,我明确地将 returnObjectsasFaults 设置为 false。然后在请求之后立即检查对象是否有故障。 NSAssert 失败。 可能是因为对象是一个 imageBlob。
我是一名优秀的程序员,十分优秀!