我正在核心数据库中创建对象。我的方法是为每个托管对象创建一个类别,并拥有一个create方法。这工作正常。但是我有大约6个类,除了类名之外,代码几乎完全相同。
因此,我认为最好让一个类传递给正在创建的类的名称并使用:
Class classType = NSClassFromString(className);
这样我就可以访问该类类型了。
致电时;
NSDictionary *attributes = [[classType entity] attributesByName];
我收到以下警告:
'实例方法'实体'用于'类',它不在根类'。
这是我的代码:
标题
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface GenericObjectCreation : NSManagedObject
+ (NSMutableDictionary *)createNewObjectWithData:(NSDictionary *)data
className:(NSString *)className
inManagedObjectContext:(NSManagedObjectContext *)context;
@end
实施
#import "GenericObjectCreation.h"
@implementation GenericObjectCreation
+ (NSMutableDictionary *)createNewObjectWithData:(NSDictionary *)data
className:(NSString *)className
inManagedObjectContext:(NSManagedObjectContext *)context
{
Class classType = NSClassFromString(className);
classType = nil;
NSMutableDictionary *nexplanons = [NSMutableDictionary new];
for (id key in data) {
NSDictionary *element = [data objectForKey:key];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:className];
request.predicate = [NSPredicate predicateWithFormat:@"organisationCode = %@", element[@"organisationCode"]];
NSError *error = nil;
NSArray *result = [context executeFetchRequest:request error:&error];
if ([result count] > 0) {
classType = result[0];
}
if (![result count]) {
classType = [NSEntityDescription insertNewObjectForEntityForName:className inManagedObjectContext:context];
}
// Loop through attributes on
NSDictionary *attributes = [[classType entity] attributesByName];
for (NSString *attribute in attributes) {
id value = [element objectForKey:attribute];
if (value == nil) {
continue;
}
[classType setValue:value forKey:attribute];
}
[nexplanons setObject:classType forKey:element[@"organisationCode"]];
}
[context save:nil];
return nexplanons;
}
@end
看起来这应该是可能的,并且会从我的项目中删除很多代码,这将是很好的。任何帮助将不胜感激。
作为一个附带问题,这被称为反思吗?