Почему мой NSMutableArray не пишет в plist? - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть следующий блок кода:

NSMutableArray* mergedSymbolsArray = [NSMutableArray array];
                    for (NSDictionary* aSymbol in localSet) {

                        NSLog(@"Symbol:%@",[aSymbol valueForKey:@"symbol"]);
                        [mergedSymbolsArray addObject:aSymbol];

                    }

                    [Utils writeObjectToPList:mergedSymbolsArray]; 
                    tickers = [Utils getDataFromPList]; 

Вот мой код для чтения / записи в plist:

+ (void)writeObjectToPList:(id)myData {  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mobile-watchlist.plist"];
    [myData writeToFile:path atomically:YES];
}  

+(NSMutableArray*)getDataFromPList
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mobile-watchlist.plist"];

    NSMutableArray* myArray = [[NSMutableArray alloc] initWithContentsOfFile:path];
    NSLog(@"READING -- PList Data Count: %d", [myArray count]);
    return [[NSMutableArray alloc] initWithContentsOfFile:path];
}

По какой-то причине mergedSymbolsArray не запишет в список. Я не уверен, почему?

Я могу написать в листе следующее:

[tickers addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"GOOG", @"symbol", @"2044", @"id", nil]];
        [tickers addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"AAPL", @"symbol", @"686", @"id", nil]];
        [tickers addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"YHOO", @"symbol", @"4177", @"id", nil]];

        [Utils writeObjectToPList:tickers];

Почему первый блок кода не записывается в plist?

ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ: Вот пример словаря, который содержит mergedSymbolsArray:

  {
    "charts_count" = 2;
    "created_at" = "2010-04-12T16:37:32Z";
    exchange = NASDAQ;
    "followers_count" = 259;
    id = 8404;
    industry = "<null>";
    "messages_count" = 1436;
    ric = "GRPN.O";
    sector = "<null>";
    symbol = GRPN;
    title = Groupon;
    "updated_at" = "2011-09-05T04:17:56Z";
}

Я предполагаю, что метод writeToFile: атомарно не работает, потому что не может быть записан?

Ответы [ 4 ]

4 голосов
/ 05 сентября 2011

Убедитесь, что все объекты, которые вы храните в массиве, являются объектами списка свойств (NSString, NSData, NSArray или NSDictionary).

2 голосов
/ 26 апреля 2012

Сбой, потому что dta содержит сектор = "", значение которого интерпретируется как NSNull и не может быть записано в список.

Я преобразовываю NSArray или NSDictionary в NSData перед сериализацией. Ниже приводится категория по nsarray для сериализации и десериализации. Это удобно, поскольку некоторые данные обрабатываются как nsnull

-(BOOL)writeToPlistFile:(NSString*)filename{
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self];
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES];
    return didWriteSuccessfull;
}

+(NSArray*)readFromPlistFile:(NSString*)filename{
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    NSData * data = [NSData dataWithContentsOfFile:path];
    return  [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
0 голосов
/ 05 сентября 2011

Попробуйте добавить косую черту к имени вашего файла, т.е.:

NSString *path = [documentsDirectory stringByAppendingString:@"/mobile-watchlist.plist"];
0 голосов
/ 05 сентября 2011

Проверьте возвращаемое значение [myData writeToFile:path atomically:YES];, пожалуйста. Если это НЕТ, во время записи произошли некоторые ошибки. Попробуйте создать-инициализировать NSMutableArray вместо создания автоматически выпущенного.

...