iphone - NSSortDescriptor 未被调用

标签 iphone objective-c ios core-data

我正在尝试对实体文件夹执行提取请求,并且我希望名为 xyz 的文件夹成为排序时的最后一个对象。

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

    [fetchRequest setEntity:entity];

    NSSortDescriptor *lastDescriptor =
    [[[NSSortDescriptor alloc] initWithKey:@"folderName" ascending:YES comparator:^NSComparisonResult(NSString* name1, NSString* name2) {
        NSLog(@"descriptor");
        if ([name1 isEqualToString:@"xyz"]) {
            return NSOrderedAscending;
        }
        if ([name2 isEqualToString:@"xyz"]) {
            return NSOrderedDescending;
        }

        return [name1 compare:name2];
    }] autorelease];  


    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor]];
    [fetchRequest setFetchBatchSize:5];

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

    [fetchRequest release];
    [theFetchedResultsController release];

    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

但是没有调用任何 NSLog 语句。他们应该这样做吗?文件夹 xyz 没有出现在最后,但所有内容最终都按字母顺序排序。我做错了什么吗?

编辑: 发布完整代码

最佳答案

此代码(您的代码)有效:

- (void)sortMe {

    NSDictionary *d0 = [NSDictionary dictionaryWithObject:@"efg" forKey:@"folderName"];
    NSDictionary *d1 = [NSDictionary dictionaryWithObject:@"xyz" forKey:@"folderName"];
    NSDictionary *d2 = [NSDictionary dictionaryWithObject:@"abc" forKey:@"folderName"];
    NSDictionary *d3 = [NSDictionary dictionaryWithObject:@"def" forKey:@"folderName"];
    NSArray *testMe = [NSArray arrayWithObjects:d0, d1, d2, d3, nil];

    NSSortDescriptor *lastDescriptor =
    [[NSSortDescriptor alloc] initWithKey:@"folderName" ascending:YES comparator:^NSComparisonResult(NSString* name1, NSString* name2) {
        NSLog(@"descriptor");
        if ([name1 isEqualToString:@"xyz"]) {
            return NSOrderedAscending;
        }
        if ([name2 isEqualToString:@"xyz"]) {
            return NSOrderedDescending;
        }

        return [name1 compare:name2];
    }];

    NSArray *sorted = [testMe sortedArrayUsingDescriptors:[NSArray arrayWithObject:lastDescriptor]];
    for (NSDictionary *d in sorted) {
        NSLog(@"value=%@", [d valueForKey:@"folderName"]);
    }
}

我预测这段代码也能工作:

NSError *error;
NSArray *result =  [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
// log the array

我认为问题出在代码其他地方的 NSFetchedResultsController 委托(delegate)设置中。

关于iphone - NSSortDescriptor 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109115/

相关文章:

ios - 在调用 CPU 密集型任务之前完成 UISlider 渲染

ios - 将 "stolen"UILabel 层添加到其他 CALayer 的子层是否安全?

ios - 任何使用 Scala 进行 iOS 编码的方法?

ios - 如果执行长任务(网络调用),则在显示加载动画时禁用用户交互。不好的做法还是好的做法?

iphone - 重新加载 UITableView 有 UITableViewCell 可见性问题

iphone - 隐藏标签栏后 View 大小减小

ios - 如何更新两个 View Controller 上的循环进度按钮?我正在使用单例类作为循环进度按钮

iphone - 解码 URLEncoded 非标准字符

iphone - 非法改变 NSFetchedResultsController 的获取请求

iphone - NSMutableURLRequest 发送部分帖子正文