Невозможно получить NSData в NSDictionary, который был записан в файл

У меня есть объект NSData, который я помещаю в словарь. Затем я пишу словарь в каталог документов. Затем я немедленно делаю URL-адрес файла доступным для контроллера uiactivityviewcontroller, чтобы он был включен для вложения в приложение Почта.

Проблема в том, что когда пользователь щелкает этот файл для импорта в приложение, все в словаре становится доступным (есть другие объекты NSString), кроме объекта NSData! Когда я проверяю, что находится внутри объекта для соответствующего ключа, который должен содержать объект NSData, он возвращает (ноль)..

Вот соответствующие фрагменты кода (некоторые я упростил для ясности, но по сути это тот же код):

    NSDictionary *dictionaryItems = @{@"stringobj":        @"string",
                                @"dataobj":       dataobject};

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSURL *dictUrl = [NSURL fileURLWithPath:[docDir stringByAppendingPathComponent:@"myinfo.myappinfo"]]; //my app will open this file type
    [dictionaryItems writeToURL:dictURL atomically:YES];

// I will include the dictURL in the activityitems array so it can be attached to the the email when the uiacitivityitemcontroller is presented

Когда приложение открывается, я просто загружаю словарь из файла и пытаюсь извлечь объект nsdata из ключа "dataobj"... но он возвращает ноль.

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if (url !=nil && [url isFileURL]) {
        self.importedDictionary = [NSDictionary dictionaryWithContentsOfURL:url];
        NSLog("%@",[self.importedDictionary objectForKey:@"dataobj"]); //returns null.. why?
    }
}

Я не уверен, почему объект NSData, который я поместил в словарь, не существует - есть мысли? Любая помощь приветствуется!

1 ответ

Решение

Спасибо, только что решил с помощью комментариев к моему вопросу.

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

Если в словаре есть какие-либо ключи, которые ссылаются на ноль элементов, то словарь не будет записывать в файл. Решил проблему, проверив, является ли каждый объект, который я хочу включить в словарь, нулевым или нет, и если это ноль, то я опускаю это в словаре, чтобы гарантировать, что он записывает в файл.

Например

NSDictionary *dictionaryItems = {@"key1":nil,@"key2":@"string object"};
BOOL didItWrite = [dictionaryItems writeToURL:dictURL atomically:YES];

//didItWrite will return NO in this case since we have a nil object in the dictionary

NSDictionary *dictionaryItems = {@"key1":dataobj,@"key2":@"string object"};
BOOL didItWrite = [dictionaryItems writeToURL:dictURL atomically:YES];

//didItWrite will return YES here since there are no objects that evaluate to nil in the dictionary.

Цитируя @GuyKogus в комментариях к вопросу:

Причина, по которой это происходит, заключается в том, что вы действительно [NSDictionary dictionaryWithObjectsAndKeys:]. В документации вы найдете, что в качестве параметра он принимает список переменных и ключей с нулевым символом в конце. Поэтому, когда значение в вашем списке равно нулю, оно игнорирует остальные параметры.

Другие вопросы по тегам