如何在核心数据上实现瞬态属性?

Spa*_*Dog 2 cocoa-touch core-data nsfetchedresultscontroller nsmanagedobject ios

我有一个名为“国家”的核心数据实体。该实体有一个名为 nameOfCountry 的字段,其中包含英语国家/地区名称。我需要将其本地化为其他语言,因此我创建了一个名为 nameOfCountryLocalized 的临时属性。

在国家类中,我正在导入此类别

国家+NameOfCountryLocalized.h

#import "Countries.h"

@interface Countries (NameOfCountryLocalized)


@property (nonatomic, strong) NSString * nameOfCountryLocalized;


@end
Run Code Online (Sandbox Code Playgroud)

国家+NameOfCountryLocalized.m

#import "Countries+NameOfCountryLocalized.h"
#import "Countries.h"

@implementation Countries (NameOfCountryLocalized)

@dynamic nameOfCountryLocalized;


-(NSString *) nameOfCountryLocalized {
  [self willAccessValueForKey:@"nameOfCountryLocalized"];
  NSString *nameLocalized = NSLocalizedString(self.nomePais, nil);
  [self didAccessValueForKey:@"nameOfCountryLocalized"];
  return nomeLocalizado;
}

-(void)setNameOfCountryLocalized:(NSString *) nameLocalized {
  [self willChangeValueForKey:@"nameOfCountryLocalized"];
  [self setNomePaisLocalizado:];
  [self didChangeValueForKey:@"nameOfCountryLocalized"];
}

@end
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 tableViewController 访问 nameOfCountryLocalized 时

- (NSFetchedResultsController *)fetchedResultsController {

  if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
  }


  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription *entity = [NSEntityDescription
                                 entityForName:@"Countries" inManagedObjectContext:self.managedObjectContext];
  [fetchRequest setEntity:entity];

  NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"nameOfCountryLocalized" ascending:YES];
  [fetchRequest setSortDescriptors:@[sort]];

  [fetchRequest setFetchBatchSize:20];

  NSFetchedResultsController *theFetchedResultsController =
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                      managedObjectContext:self.managedObjectContext
                                        sectionNameKeyPath:nil
                                                 cacheName:@"Root"];

  _fetchedResultsController = theFetchedResultsController;
  _fetchedResultsController.delegate = self;

  return _fetchedResultsController;

}
Run Code Online (Sandbox Code Playgroud)

我看到此错误:在实体中找不到 keypath nameOfCountryLocalized

有什么线索吗?

Ola*_*laf 5

NSFetchedResultsController 无法按瞬态属性排序。FRC 将排序应用于底层 SQL 存储。通过瞬态属性,FRC 可以将获取的结果分组为多个部分。该是通过将瞬态属性分配给 来创建的sectionNameKeyPath

一旦数据增长,将所有实体拉入数组将变得很痛苦。FRC 确实为更大的数据集提供了很好的支持,您不想失去它。

假设您的用户不经常切换语言,您可能没问题。如果是这种情况,我建议您将本地化的国家/地区名称作为“正常”属性写入商店,并且 FRC 可以对该属性进行排序。尽管当用户确实切换语言时,您将需要更新所有国家/地区实体。