2010-12-09 11 views
0

Liebe Community. Wenn ich eine stabile Version meiner Anwendung habe, während ich nicht starten Code zu Multithread-Version zu ändern. Was war der Unterschied zwischen früheren Version: in (void) applicationDidFinishLaunching: (NSNotification *) aNotification i do-Schleife des Code in der Warteschlange:Kerndaten Multithread mit

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++; 
} 

Externe Klasse:

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

Dieser Punkt ist sehr wichtig:

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

u nicht anderen Klassen Alloc kann ich n Prozess von u Multithreading, ich weiß nicht, warum, aber das ist nehmen malloc_error ganz Warteschlangen

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

Und in externen Klassen ich habe:

-(void) main; 
{ 

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

es ist eine nur einige Funktionen, die Arbeit an lokale Moc. Wenn ich die Anwendung starte, hat die Schnittstelle sie nicht im Hintergrund platziert und startet die Visualisierung erst, wenn alle Warteschlangen beendet sind.

Bevor ich versuche,] init] MySQLIXC-Klasse innerhalb meiner externen Klasse, aber es gibt mir eine Menge von malloc_error_break Ausnahmen, wie jemand versuchen, Speicher für mich einfrieren. Tnx.

Hier moc Erklärung: in .h:

@property(retain) NSManagedObjectContext *managedObjectContext; 

in .m: @synthesize managedObjectContext;

Sets persistenter Speicher Koordinator:

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

Änderungen Merge für mit Haupt 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]; 

Und an einer Stelle meines Codes Ich bin ein Haupt-moc mit (nur für Leseinformation, ich weiß, dass moc nicht thread sicher):

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

Antwort

1

Zunächst ist CoreData nicht Thread sicher. Ich würde Ihnen dringend raten, wenn Sie Core-Daten nicht sehr detailliert verstehen, halten Sie Ihre Anwendung einthreaded oder stellen Sie zumindest sicher, dass Sie immer von einem einzigen Thread auf den Store zugreifen (wahrscheinlich am besten, um den Hauptthread zu verwenden).

Das heißt, dies wird nicht verursachen malloc_error_breaks AFAIK. Sie würden Kerndatenzusammenführungsfehlerausnahmen und ähnliche Probleme sehen.

Könnten Sie den Code zeigen, wo Sie die moc weiter aufgebaut - nur Aufteilung und eine moc Initing ist nicht genug - man muss eingestellt es NSPersistentStoreCoordinator

+0

Lieber Roger, war Frage Update. Hauptproblem, das ich finde, dass ich keine Instanz von externen Klassen in Code machen kann, nur in init. Nachdem ich Änderungen vorgenommen habe, war der gesamte malloc Fehler aus. Aber wahrscheinlich können Sie in diesem Fall etwas mehr vorschlagen, zum Beispiel, wie ich einige Daten wie Array zwischen Threads behalten kann. – Alex

+0

NSArray ist ein wenig threadsicher, also sollte es einfach funktionieren - der normale Vorbehalt gilt, dass Sie jeden geteilten Zugriff sperren müssen. Nur weil NSArry nicht explodiert, heißt das nicht, dass dein Design Threadsicher ist. Es sei denn, Sie benötigen wirklich Threading-Unterstützung, ich würde es vermeiden. Wenn Sie es wirklich brauchen, schlage ich eine neue Frage vor :-) –