核心数据多线程使用

时间:2010-12-09 13:49:21

标签: objective-c multithreading core-data

亲爱的社区。 当我有一个稳定版本的应用程序,而我没有启动更改代码到多线程版本。以前的版本有什么区别: in(void)applicationDidFinishLaunching:(NSNotification *)aNotification 我循环添加队列我的代码:

 NSOperationQueue *opQueueImportUpdateFirstTimeData =   [[[NSOperationQueue alloc]init]autorelease];
 int i = 0;
 for (NSString *carrier in currentCarriers)
 {
    AppController *operation = [[AppController alloc] initAndUpdateCarrier:carrier identifier:i];
    [opQueueImportUpdateFirstTimeData addOperation:operation]; 
    i++;
 }

外部课程有:

- (id)initAndUpdateCarrier:(NSString *)forCarrier 
                identifier:(NSUInteger)iQuene;
{
    [super init];
    [self setIdentifierQuene:iQuene];
    [self setStartForCarrier:forCarrier];
    [self setPercentDone:0.0];

这一点非常重要:

    [self setDatabase:[[MySQLIXC alloc] init]];

你不能在多线程的过程中分配其他类,我不知道为什么,但这是整个队列中的malloc_error

    [self setAppDelegate:[[NSApplication sharedApplication] delegate]];
    [self setManagedObjectContext:[[NSManagedObjectContext alloc] init]];
    return self;
}

在外部课上我有:

 -(void) main;
{

[self makeUpdatesForCarrier:startForCarrier andTypeOfOperation:@"rates" forDirection:@"incoming"];// mySqlConnector:database];

它只是一些在本地moc上工作的函数。 当我启动应用程序时,界面没有将它放在后台,并且只有在所有队列完成后才开始可视化。

在我尝试在我的外部类中分配] init] MySQLIXC类之前,它给了我很多malloc_error_break异常,就像有人试图为我冻结内存一样。 TNX。

这是moc声明: 在.h:

@property(retain) NSManagedObjectContext *managedObjectContext;
在.m中的

:     @synthesize managedObjectContext;

设置持久性商店协调员:

[[self managedObjectContext] setUndoManager:nil];
[[self managedObjectContext] setPersistentStoreCoordinator:[appDelegate persistentStoreCoordinator]];

使用main moc合并更改:

- (void)mergeChanges:(NSNotification *)notification;
{
AppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];

// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                              withObject:notification
                           waitUntilDone:YES];  

在我的代码的一个地方我正在使用一个主moc(仅用于读取信息,我知道moc不是线程安全的):

AppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"DestinationsListForSale"
                               inManagedObjectContext:mainContext]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastUsedProfit > 0"]; 
[request setPredicate:predicate];

1 个答案:

答案 0 :(得分:1)

首先,CoreData不是线程安全的。我强烈建议,如果您不了解核心数据的详细信息,请保持应用程序是单线程的,或者至少确保您始终从单个线程访问存储(可能最好使用主线程)。 / p>

那就是说,这不会导致malloc_error_breaks AFAIK。您会看到核心数据合并错误异常和类似问题。

你能否展示你进一步设置moc的代码 - 只分配和启动moc是不够的 - 你必须设置它的NSPersistentStoreCoordinator