【问题标题】:core data multithread using核心数据多线程使用
【发布时间】:2010-12-09 13:49:21
【问题描述】:

亲爱的社区。 当我有一个稳定版本的应用程序时,我不会开始将代码更改为多线程版本。与以前的版本有什么区别: 在 (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 异常,就像有人试图为我冻结内存一样。 肿瘤坏死因子。

这是 moc 声明: 在 .h 中:

@property(retain) NSManagedObjectContext *managedObjectContext;

在 .m 中: @synthesize managedObjectContext;

设置持久存储协调器:

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

与主 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];

【问题讨论】:

    标签: objective-c multithreading core-data


    【解决方案1】:

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

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

    您能否进一步展示您设置 moc 的代码 - 仅分配和初始化 moc 是不够的 - 您必须将其设置为 NSPersistentStoreCoordinator

    【讨论】:

    • 亲爱的罗杰,问题已更新。我发现的主要问题是,我无法在代码中创建外部类的实例,而只是在 init 中。在我进行更改后,所有 malloc 错误都消失了。但也许你可以在这种情况下提出更多建议,例如我如何在线程之间保留一些数据,如数组。
    • NSArray 是一种线程安全的,所以它应该可以正常工作 - 正常的附带条件适用于您需要锁定任何共享访问。仅仅因为 NSArry 没有崩溃并不意味着你的设计是线程安全的。除非你真的需要线程支持,否则我会避免它。如果你真的需要它,我建议一个新问题:-)
    猜你喜欢
    • 2013-03-02
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多