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];
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
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 :-) –