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
有什么线索吗?
NSFetchedResultsController 无法按瞬态属性排序。FRC 将排序应用于底层 SQL 存储。通过瞬态属性,FRC 可以将获取的结果分组为多个部分。该组是通过将瞬态属性分配给 来创建的sectionNameKeyPath。
一旦数据增长,将所有实体拉入数组将变得很痛苦。FRC 确实为更大的数据集提供了很好的支持,您不想失去它。
假设您的用户不经常切换语言,您可能没问题。如果是这种情况,我建议您将本地化的国家/地区名称作为“正常”属性写入商店,并且 FRC 可以对该属性进行排序。尽管当用户确实切换语言时,您将需要更新所有国家/地区实体。