亲爱的社区。 当我有一个稳定版本的应用程序,而我没有启动更改代码到多线程版本。以前的版本有什么区别: 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];
答案 0 :(得分:1)
首先,CoreData不是线程安全的。我强烈建议,如果您不了解核心数据的详细信息,请保持应用程序是单线程的,或者至少确保您始终从单个线程访问存储(可能最好使用主线程)。 / p>
那就是说,这不会导致malloc_error_breaks AFAIK。您会看到核心数据合并错误异常和类似问题。
你能否展示你进一步设置moc的代码 - 只分配和启动moc是不够的 - 你必须设置它的NSPersistentStoreCoordinator