2010-09-13 20 views
1

J'utilise NSURLConnection pour obtenir le contenu d'un fichier plist d'un serveur distant. Lors de la connexion: didRecieveData: j'ajoute les données les plus récentes à un NSMutableString.NSArray de NSString (au format plist)

Maintenant, mon problème est d'ajouter ces données à un tableau. Donc vous avez arrayWithContentsOfURL - qui est synchrone - mais je suppose que je pourrais simplement ajouter le contenu de NSString à un fichier dans le répertoire de documents de l'application et ensuite utiliser arrayWithContentsOfURL?

J'espérais juste qu'il pourrait y avoir un moyen plus facile?

Merci

Répondre

0

je fais les mêmes choses dans mes applications, j'utilise ASIHttpRequest qui fonctionne parfaitement. Après avoir récupéré ma chaîne, je traduis dans un dictionnaire.

NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:myString]; 

Ce dictionnaire que j'envoie à une classe d'analyse, dont je peux obtenir un objet.

xmlTrainNumber* fileResult = [[[xmlTrainNumber alloc] initWithDictionary:dict] autorelease]; 

la xmlTrainNumber de classe ressemble à ceci:

#import "xmlTrainNumber.h" 
#import "trainNumberResultSet.h" 

@interface xmlTrainNumber (Private) 

- (NSArray*)_parseXmlDictionary:(NSDictionary*)aDictionary; 

@end 

@implementation xmlTrainNumber 

@synthesize timeXmlResult; 

- (id)initWithDictionary:(NSDictionary*)aDictionary 
{ 
    self = [super init]; 
    if (self) 
    { 
     timeXmlResult = [self _parseXmlDictionary:aDictionary]; 
    } 
    return self; 
} 

- (NSArray*)_parseXmlDictionary:(NSDictionary*)aDictionary 
{ 
    if (aDictionary != NULL && [aDictionary count] > 0) 
    { 
     NSNumber *version = [aDictionary objectForKey:@"version"]; 
     NSNumber *statusCode = [aDictionary objectForKey:@"statusCode"]; 

     if ([[statusCode stringValue] isEqualToString:@"1"]) 
     { 
      NSString *title = [aDictionary objectForKey:@"title"]; 
      if (version != NULL) 
      { 
       NSArray* results = [aDictionary objectForKey:@"results"]; 

       if (results != NULL) 
       { 
        NSMutableArray* result = [[NSMutableArray alloc] init]; 
        for (NSDictionary* currentResult in results) 
        { 
         // TODO: add error handling 
         [result addObject:[[trainNumberResultSet alloc] initWithStation:[currentResult objectForKey:@"station"] 
                       arrival:[currentResult objectForKey:@"arrival"] 
                       departure:[currentResult objectForKey:@"departure"] 
                      newArrival:[currentResult objectForKey:@"newArrival"] 
                      newDeparture:[currentResult objectForKey:@"newDeparture"] 
                     expectedArrival:[currentResult objectForKey:@"expectedArrival"] 
                     expectedDeparture:[currentResult objectForKey:@"expectedDeparture"] 
                        track:[currentResult objectForKey:@"track"] 
                        info:[currentResult objectForKey:@"info"] 
                        title:title]]; 
        } 

        return result; 
       } 
       else 
       { 
        // TODO: throw exception instead 
        return NULL; 
       } 
      } 
      else 
      { 
       // TODO: throw exception instead 
       return NULL; 
      } 
     } 
     else { 
      return nil; 
     } 

    } 
    else 
    { 
     // TODO: throw exception instead 
     return NULL; 
    } 
} 

- (NSArray*)getTimeResult 
{ 
    return timeXmlResult; 
} 

- (void)dealloc 
{ 
    if (timeXmlResult != NULL) 
    { 
     [timeXmlResult release]; 
    } 
    [super dealloc]; 
} 

@end 

La classe trainNumberResultSet est juste une classe avec des setters qui enregistre les données affectées. J'ai quelques todo gauche dans ce code ... mais j'espère que cela peut vous aider de toute façon. Ça marche pour moi. Le tableau est une liste d'objets trainNumberResultSet.