Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将核心数据结果排序到NSFetchedResultsController中_Iphone_Objective C_Ios_Core Data - Fatal编程技术网

Iphone 将核心数据结果排序到NSFetchedResultsController中

Iphone 将核心数据结果排序到NSFetchedResultsController中,iphone,objective-c,ios,core-data,Iphone,Objective C,Ios,Core Data,我有一个实体标记,带有字符串属性标记名。我将此实体中的所有对象提取到NSFetchedResultsController,但我希望标记名为的标记名为“Main”作为第一个对象。以下是我现在正在做的: NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription

我有一个实体
标记
,带有字符串属性
标记名
。我将此实体中的所有对象提取到
NSFetchedResultsController
,但我希望标记名为
的标记名为“Main”作为第一个对象。以下是我现在正在做的:

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Tag" inManagedObjectContext:appDelegate.managedObjectContext];

[fetchRequest setEntity:entity];

NSSortDescriptor *lastDescriptor2 =
[[[NSSortDescriptor alloc] initWithKey:@"tagName" ascending:NO comparator:^NSComparisonResult(NSString* tag1, NSString* tag2) {
    NSLog(@"compare");
    if ([tag1 isEqualToString:@"main"]) return NSOrderedAscending;
    if ([tag2 isEqualToString:@"main"]) return NSOrderedDescending;
    return [tag1 compare:tag2];
}] autorelease];  

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor2]];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
self.fetchedResultsController.delegate=self;   

if (![[self fetchedResultsController] performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
此代码在my
viewDidLoad
方法中调用,只调用一次。第一次调用它时,由于某种原因,这里的sortDescriptor不适用-它只是没有被调用(
NSLog
语句也没有显示)。我的结果仅基于我为升序指定的
BOOL
值返回-该块被忽略

但是,当我在
MOC
中插入一个新的
标记
对象并调用
NSFetchedResultsController
更新委托方法时,实际的sortDescriptor将被应用,并且
NSLog(@“compare”)
最终出现,但只有在我对对象进行更新时才会出现!无论我尝试了什么,我都无法获得应用于初始获取的排序


有什么想法吗

正如您可能在某一点上看到的,如果传入NSFetchRequest的谓词是块谓词,则您的fetch请求将失败。之所以会发生这种情况,是因为CoreData需要将谓词转换为SQL,以便能够针对数据库运行它。其结果是,谓词永远不会与获取请求产生的对象进行实际比较

排序描述符也是如此。在执行提取时,提取请求不会对对象执行比较。它作为SQL的一部分传递


您还描述了我上面描述的规则的一个有趣的例外。当您拥有现有NSFetchedResultsController并将对象添加到NSManagedObjectContext时,NSFetchedResultsController将通过对对象评估NSPredicate和NSSortDescriptor而不是将其转换为SQL来更新

Mohabitar,您是否尝试过使用标准排序描述符而不是带有自定义比较器的排序描述符?我之所以这样说,是因为有一些奇怪的未指定规则,关于在获取存储时实际可以应用哪些类型的操作。另外,我建议您将您的测试仅限于NSFETCH请求。结果控制器加入了噪声。看,确保抓取工作正常。然后担心显示它。AndrewYa使用正常的排序描述符,一切都正常工作。正在执行提取。我的结果甚至是用上面的排序描述符按字母顺序获取的,所以一切都正常。我在没有NSFetchedResultsController的正常获取请求上尝试了这个精确的排序描述符,它工作得很好。只是NSFetchedResultsController给我带来了问题。