CoreData - 后台线程中的计算属性

时间:2011-08-29 20:15:45

标签: core-data

我从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];

2 个答案:

答案 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当然是有效的,但这是一个很慢的方法,特别是如果你有数千个对象需要处理。它也不像合并那样更新整个对象图。