Enregistrer un NSMutableArray dans un fichier

marcelo

Membre confirmé
22 Mars 2011
19
0
Bonjour,
J'ai une NSNotification qui est envoyée et qui appelle la méthode "didReceiveNavData" qui stock dans un NSMutableArray l'objet envoyé par cette notification avec pour clé "nav" ensuite ce que je n'arrive pas à faire, dans un premier temps, c'est afficher le contenu de ce NSMutableArray pour ensuite dans un deuxième temps l'enregistrer dans un fichier.


notification envoyée :

[[NSNotificationCenter defaultCenter] postNotificationName:@"NavDataNotification" object:nil userInfo:[NSDictionary dictionaryWithObject:[data hexdump] forKey:@"nav"]];

méthode appelée par la notification dans la classe NavTransaction :

- (void)didReceiveNavData:(NSNotification *)notification
{
DLog(@"didReveiveNavData");
[trames addObject:[notification.userInfo objectForKey:@"nav"]];
if ([delegate respondsToSelector:@selector(transaction:didReceiveNavData:)])
{
[delegate transaction:self didReceiveNavData:[trames lastObject]];
}
}

ma méthode pour enregistrer dans la classe NavSave :

- (void)saveText
{
transaction = [[NavTransaction alloc] init];
transaction.delegate = self;
[transaction begin];

path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
dossierDocument = [path objectAtIndex:0];
fichier = @"hello_ipad";
fichierFinal = [dossierDocument stringByAppendingPathComponent:fichier];

[transaction.trames writeToFile:fichierFinal atomically:YES];
}

En faisant un DLog(@"count : %@", [transaction.trames count]); j'obtient NULL ce qui veut dire que je récupère un tableau vide.
En faite le problème vient de la récupération de l'objet je pense...

Merci pour toute aide :zen:
 
Dernière édition:
Bon je peux plus éditer mon message dommage bref... Mon problème d'après ce que j'ai compris c'est la récupération de mon objet à partir d'une autre classe pour cela je dois utiliser un getter/setter?
je ne sais vraiment pas comment faire en objective c :sick: , en c++ oui mais là... si quelqu'un peut m'éclaircir la chose
merci
 
je suis vraiment bloqué d'après ce que j'ai compris il faut utiliser les accesseurs mais je n'arrive toujours pas :

En simplifié j'ai dans NavTransaction.h :
@interface NavTransaction : NSObject
{
NSMutableArray *trames2;
}
@property (copy) NSMutableArray *trames2;

NavTransaction.m :
@implementation NavTransaction
@synthesize trames2;

trames2 = [[NSMutableArray alloc] init];
[trames2 addObject:@"Test"];

Et dans NavSave là je vois pas bien ce qu'il faut mettre pour l'instant j'ai pour NavSave.h :
#import "NavTransaction.h"
@interface NavSave : NSObject
{
NavTransaction *transaction;
}

Dans NavSave.m :
@implementation NavSave
@synthesize transaction;
- (void)saveText
{
c'est ici dont j'ai besoin de récupérer trames2...
}
 
Dernière édition:
tu nous as dit que tu savais faire ca en c++ :rateau::rolleyes: c'est un peu du pipo dis moi,
parce que la ce sont les bases de l'objet, initialization d'un membre de class / setting/getting (allocation) un membre de class,

ce serait la meme chose en python, php, smalltalk, java, C# et j'en passe :p la seule difference c'est q'obj-c est context "aware" self peut referer a un context static comme dynamique, chose que tu retrouves en python ou ruby par exemple,

et tu n'as toujours pas lu l'introduction a l'obj-c c'est a dire imprimer le PDF et lu serieusement ou alors l'obj-c le c++ ecetera sont des choses bien trop compliquées pour toi, acquiere les bases avec un language de script comme php par exemple, assez simple empreintant la meme synthax et les bases de l'objet CF un container class, puis fait du C, then reviens a la l'obj-c.

Parfois :mouais: je me demande bien pourquoi les nouibs essayent de nous vendret des histoires a propos de tel ou tel truc ou connaissance, surtout dans ce genre de situation ridicule... :rolleyes: gardez vos flutiaux rangés dans le placard :p vous nous faites marrer, assumer votre condition humaine, travailler plus, il y a un manque de travail personel flagrant, tu ne mets meme pas la charette avant les boeufs, dans ton cas, la charette n'est meme pas construite et les boeufs ne sont pas nés, quand on veut''', il faut commencer par s'en donner les moyens.
 
Dernière édition:
ok merci de ton aide précieuse si c'est pour me dire sa autant ne pas me répondre du tout et me laisser ne pas comprendre un point de ce langage... et oui en C++ je sais faire un getter/setter mais bon on ne peut pas tous apprendre un langage parfaitement lorsqu'on est en projet avec un temps limité et pleins d'autres choses à faire à coté en gros je ne peux pas me permettre de rester à apprendre l'objective c 24/24 ce que j'aimerais mais c'est la dure lois des études bon je vais me replonger dans la doc.
si quelqu'un à l'amabilité de m'expliquer et non résoudre mon problème je serrait reconnaissant
 
Dernière édition:
Les concepts de la programmation objet sont indépendants du langage utilisé. Donc si tu ne parviens pas à utiliser de getter/setter en Obj-C, c'est que tu ne dois pas tout avoir compris de la POO. Car l'apprentissage de l'Obj-C, comme s'en vantait Apple, c'est un après-midi ... à condition d'avoir les bases nécessaires, et toi tu ne les a pas. :siffle:
 
Bon je tente une dernière fois si quelqu'un peut m'expliquer se qu'il ne va pas toujours pour récupérer mon NSMutableArray avec un accesseur je galère vraiment malgré la doc :mouais:

NavTransaction.h
Bloc de code:
@interface NavTransaction : NSObject 
{
NSMutableArray *trames;
}
@property (nonatomic, retain) NSMutableArray *trames;
- (NSMutableArray *) trames;
NavTransaction.m
Bloc de code:
#import "NavTransaction.h"
@interface NavTransaction()
@end
@implementation NavTransaction
@synthesize trames;

- (void)didReceiveNavData:(NSNotification *)notification
{
    DLog(@"didReveiveNavData");
    [trames addObject:[notification.userInfo objectForKey:@"nav"]];

    if ([delegate respondsToSelector:@selector(transaction:didReceiveNavData:)]) {
        [delegate transaction:self didReceiveNavData:[trames lastObject]];
    }
}

- (NSMutableArray *)trames
{
    return trames;
}
NavSave.h
Bloc de code:
#import "NavTransaction.h"
@interface NavSave : NSObject 
{    
    NavTransaction *transaction;
    
    NSString *file;
    NSArray *path;
    NSString *directory;
    NSString *finalFile;
}
- (void) saveText;
@end
NavSave.m
Bloc de code:
@implementation NavSave

- (void)saveText
{
    transaction = [[NavTransaction alloc] init];
    NSMutableArray *trame = [transaction trames];
    //NSMutableArray *trame = transaction.trames;

    path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        
    directory = [path objectAtIndex:0];
    file = @"NavSave";
    
    finalFile = [directory stringByAppendingPathComponent:file];
    
    [trame writeToFile:finalFile atomically:YES]; 
}
 
j'ai du mal, donc si je veux uniquement lire je dois utiliser

@property(readonly, getter=getTrames) NSMutableArray *trames;

et pour l'implémentation

- (NSMutableArray *) getTrames
{
return trames;
}
 
j'ai essayé les 2 solutions et sa ne marche pas...
si j'ai bien compris le @property (readonly) NSMutableArray *trames; est équivalent à la déclaration des méthodes get/set et le @synthesize trames; est équivalent à l'implémentation des méthodes get/set donc là ou je veux récupérer je crée une instance NNavTransaction *transaction = [[NavTransaction alloc] init]; et je récupère soit par la méthode soit par l'attribut : NSMutableArray *trame = [transaction trames]; ou NSMutableArray *trame = transaction.trames; :confused: