我在我的OSX應用程序中獲取給定類型的所有元素的方法(GEElementType
是枚舉)。它在大多數情況下都能正常工作,但在某些情況下,[NSManagedObjectContext executeFetchRequest:error:]
最終多次呼叫[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]
將新對象添加到MOC中......這是否是預期行爲?我可以一致地重現這一點,但我不明白它爲什麼這樣工作。核心數據查詢在託管對象上下文中插入新對象
這裏有一個代碼摘錄:
+ (NSArray*)elementsOfType:(GEElementType)elementType
{
return [GEElement findAllObjectsWithPredicate:[NSPredicate predicateWithFormat:@"elemtype == %d", elementType]];
}
+ (NSArray*)findAllObjectsWithPredicate:(NSPredicate*)predicate
{
NSManagedObjectContext* context = [GEDataManager sharedInstance].managedObjectContext;
NSEntityDescription* entity = [self entityDescription];
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setPredicate:predicate];
NSError* error = nil;
NSArray* result = [context executeFetchRequest:request error:&error];
if (error)
{
NSLog(@"%@", error.localizedDescription);
}
return result;
}
如果這有什麼差別,我使用的是Mogenerator使用自定義的基礎NSManagedObject子類。
我在子類中增加了一個斷點init和這裏的堆棧跟蹤:
#0 0x000000010003bf5a in -[GEElement initWithEntity:insertIntoManagedObjectContext:] at /.../DataModel/Human/GEElement.m:27
#1 0x00007fff89166abc in -[NSManagedObject(_NSInternalMethods) _initWithEntity:withID:withHandler:withContext:]()
#2 0x00007fff8916540e in -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:optionalHandler:withInlineStorage:]()
#3 0x00007fff891be7f6 in -[NSMappedObjectStore executeFetchRequest:withContext:]()
#4 0x00007fff89154e63 in -[NSPersistentStoreCoordinator executeRequest:withContext:error:]()
#5 0x00007fff89152c1b in -[NSManagedObjectContext executeFetchRequest:error:]()
#6 0x000000010000e50c in +[GEDataModelBase findAllObjectsWithPredicate:] at /.../DataModel/GEDataModelBase.m:72
#7 0x00000001000c04da in +[GEElementTypes elementsOfType:] at /.../Helpers/GEElementTypes.m:75
...etc...
編輯:這裏是GEElement init方法,按要求。 27號線是第一個。
- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context
{
self = [super initWithEntity:entity insertIntoManagedObjectContext:context];
if (self)
{
// ...A bunch of property initializations here...
}
return self;
}
如果需要,我可以發佈所有屬性初始化,但沒有什麼特別的。
你能用包含第27行的GEElement中的方法更新你的問題嗎? – quellish 2014-09-25 05:55:41
我認爲你使用的是XML存儲? – quellish 2014-09-25 06:05:22
嘿涼一下,我用包含第27行(第一個)的GEElement init方法更新了我的問題。我正在使用從JSON文件加載的內存存儲。 – Mariano 2014-09-25 14:26:13