ios - автоматическая запись в файл не работает

Я сделал файл UMsgs.plist следующим образом

введите здесь описание изображения

и вызовите метод ниже

-(void) checkIsChangedUMsg
{
    BOOL isNewMsg = NO;

    NSString *destPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
destPath = [destPath stringByAppendingPathComponent:@"UMsgs.plist"];

// If the file doesn't exist in the Documents Folder, copy it.
    NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:destPath]) {
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"UMsgs" ofType:@"plist"];
    [fileManager copyItemAtPath:sourcePath toPath:destPath error:nil];
}

// Load the Property List.
   NSMutableArray *dataArray = [[NSMutableArray alloc] initWithContentsOfFile:destPath];

   for( int i = 0; i < [dataArray count] ;i++)
  {
    NSString * oldMessengerID = [dataArray[i] objectForKey:@"messengerid"];
    NSString * oldMessageCount = [dataArray[i] objectForKey:@"messageCount"];

    NSString * newMessengerID = [UMsgsInfoArray[i] objectForKey:@"messengerid"];
    NSString * newMessageCount = [UMsgsInfoArray[i] objectForKey:@"messageCount"];

    if( !([oldMessengerID isEqualToString:newMessengerID] && 
          [oldMessageCount isEqualToString:newMessageCount]) )
    {
        NSDictionary * newDict = [[NSDictionary alloc] initWithObjectsAndKeys:newMessageCount,@"messageCount",newMessengerID,@"messengerid",nil];
        dataArray[i] = newDict;
        isNewMsg = YES;
    }

  }

if(isNewMsg)
{
   BOOL success =  [dataArray writeToFile:destPath atomically:YES];

}

}

массив данных

введите здесь описание изображения

но [dataArray writeToFile:destPath атомарно:YES]; вернуть НЕТ

почему это не работает? как мне это исправить?


person 석진영    schedule 26.07.2015    source источник


Ответы (1)


Похоже, что dataArray содержит один или несколько объектов, которые не являются объектами списка свойств ( более конкретно NSNull объект(ы) ). writeToFile:atomically: вернет NO, если это так.

В документации упоминается следующее о writeToFile:atomically:

Этот метод рекурсивно проверяет, что все содержащиеся объекты являются объектами списка свойств перед записью файла, и возвращает НЕТ, если все объекты не являются объектами списка свойств, поскольку результирующий файл не будет допустимым списком свойств.

Кроме того, вы можете попробовать сделать изменяемую копию NSArray, сделать что-то, а затем сделать неизменяемую копию перед попыткой записи в файл.

eg.

// Load the Property List.

NSMutableArray *dataArray = [[[NSArray alloc] initWithContentsOfFile:destPath] mutableCopy];

и сделать неизменяемым перед записью-

BOOL success =  [[dataArray copy] writeToFile:destPath atomically:YES];
person Bamsworld    schedule 26.07.2015