2010-12-09 21 views
0

Dear community. Lorsque j'ai une version stable de mon application, alors que je ne démarre pas le code de la version multithread. Quelle était la différence entre la version précédente: dans (void) applicationDidFinishLaunching: (NSNotification *) aNotification je fais boucle pour ajouter à la file d'attente mon code:multithread de données de base en utilisant

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

classe externe ont:

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

ce point est un élément très important:

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

u ne peut pas alloc autres classes i processus n de u multithreading, je ne sais pas pourquoi, mais cela est de prendre malloc_error dans les files entières

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

Et en classe externe j'ai:

-(void) main; 
{ 

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

il y a un juste quelques fonctions travaillant sur moc local. Lorsque je démarre une application, l'interface ne la place pas en arrière-plan et ne démarre la visualisation qu'une fois toutes les files d'attente terminées. Avant d'essayer d'allouer] init] classe MySQLIXC dans ma classe externe, mais il me donne beaucoup d'exceptions malloc_error_break, comme quelqu'un essaie de geler la mémoire pour moi. Tnx.

Voici la déclaration moc: en .h:

@property(retain) NSManagedObjectContext *managedObjectContext; 

dans .m: @synthesize managedObjectContext;

Set coordinateur du magasin persistant:

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

fusionner les modifications pour avec les principaux 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]; 

Et en un seul endroit de mon code, je suis sur un moc principal (uniquement pour les informations lues, je sais que moc pas thread thread):

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

Répondre

1

Tout d'abord, CoreData n'est pas thread-safe. Si vous ne comprenez pas les données de base avec beaucoup de détails, je vous conseille fortement de garder votre application à l'identique ou à tout le moins de toujours accéder au magasin à partir d'un seul fil (probablement le fil principal). Ceci dit, ceci ne causera pas de coupures de MAC_Courant_Alloc. Vous verriez des exceptions d'erreur de fusion de données de base et des problèmes similaires.

Pourriez-vous montrer le code où vous configurez le moc plus - juste allocation et Initing un moc ne suffit pas - vous devez régler est NSPersistentStoreCoordinator

+0

Cher Roger, question était mise à jour. Problème principal, que je trouve, que je ne peux pas faire d'instance de classes externes dans le code, juste dans init. Après avoir fait des changements, toute erreur malloc était hors. Mais probablement vous pouvez suggérer quelque chose de plus dans ce cas, par exemple comment je peux garder certaines données comme tableau entre threads. – Alex

+0

NSArray est un peu threadsafe donc ça devrait fonctionner - la condition normale est que vous devrez verrouiller tout accès partagé. Juste parce que NSArry ne fait pas exploser ne signifie pas que votre design est threadsafe. À moins que vous ayez vraiment besoin d'un support de threading, je l'éviterais. Si vous en avez vraiment besoin, je vous suggère une nouvelle question :-) –