2011-08-29 22 views
0

我从CoreData中获取大约2500颗星以用于构建星图,并且想要在后台线程中计算坐标等的大部分数学运算,原因很明显。我的问题是,因为我必须将CoreData对象作为NSManagedObjectID s传递回主线程,您将如何处理计算,例如后台线程中的一组笛卡尔坐标,并且(最好)在NSManagedObject子类中设置这些坐标?CoreData - 后台线程中的计算属性

对于它的价值,这里是我使用的是从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

你通常不会“传递CoreData对象回主线程作为NSManagedObjectIDs”,而是你将执行所有操作设置与上下文在后台线程上运行被管理对象,那么当你完成时,你会合并前景上下文和后台上下文。

传递managedObjectIDs当然是可行的,但它是一种缓慢的方式去解决它,特别是如果您有数千个对象要处理。它也不像合并那样更新整个对象图。

+0

'你会合并前景上下文和背景上下文' - 你能指出我的一个例子吗? –

+0

请参阅核心数据编程指南:使用通知在其他线程中跟踪更改http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdConcurrency.html#//apple_ref/doc/uid/TP40003385-SW5 – TechZen

+0

这篇文章说的与你的回答所说的相反。 '要通过线程边界从另一个上下文“传递”一个托管对象,您可以:在接收托管对象上下文中传递其对象ID(objectID)并使用objectWithID:或existingObjectWithID:error :. – iwasrobbed