我从CoreData
获取大约2500颗星,用于构建星图,并且想要在背景线程中进行大部分数学计算坐标,原因很明显。我的问题是,因为我必须将CoreData
个对象作为NSManagedObjectID
传递回主线程,你将如何计算说,在后台线程中的一组笛卡尔坐标和(最好)在NSManagedObject
子类中设置这些坐标?
对于它的价值,这里是我用来从CoreData获取并传递给主线程的代码片段:
// Context and Model
NSManagedObjectContext *context = [self.dataProvider newManagedObjectContext];
NSManagedObjectModel *model = [self.dataProvider sharedManagedObjectModel];
// Fetch the stars
NSArray *stars = [SkyObject getSkyObjectsBetweenMinCoords:minCoords
maxCoords:maxCoords
minMag:self.minimumMagnitude
maxMag:self.maximumMagnitude
model:model
context:context];
NSMutableArray *starIDs = [[NSMutableArray alloc] init];
// Add the star's objectID to the set
for (SkyObject *star in stars) {
[starIDs addObject:star.objectID];
}
// Pass objects across thread boundaries
[self performSelectorOnMainThread:@selector(updateLocalContextWithObjectIDs:) withObject:starIDs waitUntilDone:YES];
// Release retained memory
[starIDs release];
[context release];
答案 0 :(得分:1)
我可以从你的问题和代码中看出这是我的头脑。但GCD怎么样?它通过tcp / ip发送给重复保持活动的东西。无论如何希望它有所帮助 http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/
答案 1 :(得分:0)
您通常不会“将CoreData对象作为NSManagedObjectIDs传递回主线程”,而是执行所有操作来设置托管对象,并在后台线程上运行上下文,然后当您完成后,将前景上下文与背景上下文合并。
传递managedObjectIDs当然是有效的,但这是一个很慢的方法,特别是如果你有数千个对象需要处理。它也不像合并那样更新整个对象图。