我正在通过Core Data开发一个应用程序,我需要在后台线程中执行一些计算,以根据特定的NSManagedObject
创建一个xml文件。
在文档之后,我设置了NSOperation
子类。该类具有如下属性:
@property (nonatomic, retain) NSArray* objectIDs;
其中objectIDs
是托管对象ID的数组(类型为NSManagedObjectID
)。根据文档,这是必要的:NSManagedObject
不是线程安全的。
在main
子类的NSOperation
内,我正在执行以下操作:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSManagedObjectContext *exportContext = [[NSManagedObjectContext alloc] init];
[exportContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
for (NSManagedObjectID* objectID in self.orderObjectIDs) {
NSError* error = nil;
Order* order = (Order*)[exportContext existingObjectWithID:objectID error:&error];
// order.someRelationship is fault here...
// Create XML file here...
}
[exportContext reset];
[exportContext release], exportContext = nil;
[[NSNotificationCenter defaultCenter] postNotificationName:kRegisterComplete object:self];
[pool drain];
pool = nil;
在for
循环内我使用existingObjectWithID:error
类的NSManagedObjectContext
方法获取正确的对象,因为
与objectWithID:不同,此方法永远不会返回错误。
该方法有效。我能够检索该检索对象的属性。唯一的问题是关系被视为错误。
说这个,我有两个问题。
首先,这是后台线程中fecth NSManagedObject
的正确方法吗?
那么,如何在for
循环中获取每个获取对象的关系?我是否必须根据通过id获取的特定对象创建NSFetchedRequest
来获取关系对象?
提前谢谢。
答案 0 :(得分:2)
为什么你关心这种关系是错误的?访问它将填补故障并返回数据,您是否因某种原因关注磁盘I / O?
您可以尝试使用预取来减轻一些I / O开销,但它的实用程序仅限于正在获取的实体之间的关系:
在这种情况下,您将使用如下谓词创建一个获取请求:
[NSPredicate predicateWithFormat:@"SELF == %@", objectID];
这将只返回您想要的托管对象,并且通过关系预取关系不会是错误。
您可以通过使用IN子句并一次获取所有对象来进一步优化它:
[NSPredicate predicateWithFormat:@"SELF IN (%@)", desiredObjectIDs];
答案 1 :(得分:0)
您需要确保以下内容:
[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
。(在主线程上)
[managedObjectContext obtainPermanentIDsForObjects:objectIDs error:nil]
dispatch_sync(dispatch_get_main_queue(), {
[managedObjectContext save:nil];
});
您可以根据哪种方式更方便地制作NSFetchRequest或直接访问关系;可能直接访问关系。在日常工作结束时,您无需致电[NSManagedObjectContext reset]
。