NSArray из NSString (в формате plist) - PullRequest
1 голос
/ 13 сентября 2010

Я использую NSURLConnection для получения содержимого файла plist с удаленного сервера.

При подключении: didRecieveData: я добавляю последние данные в NSMutableString.

Теперь моя проблема заключается в добавлении этих данных в массив. Итак, у вас есть arrayWithContentsOfURL - который является синхронным - но я полагаю, я мог бы просто добавить содержимое NSString в файл в каталоге документов приложения и затем использовать arrayWithContentsOfURL?

Я просто надеялся, что может быть проще?

Спасибо

1 Ответ

0 голосов
/ 13 сентября 2010

Я делаю то же самое в своих приложениях, я использую ASIHttpRequest , который отлично работает. Получив мою строку обратно, я перевожу в словарь.

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

Этот словарь, который я отправляю классу разбора, из которого я могу получить объект.

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

класс xmlTrainNumber выглядит так:

#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

Класс trainNumberResultSet - это просто класс с некоторыми установщиками, который сохраняет назначенные данные. У меня осталось несколько todo в этом коде ... но я надеюсь, что это может помочь вам в любом случае. Меня устраивает. Массив представляет собой список trainNumberResultSet объектов.

...