Невозможно получить 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:]. В документации вы найдете, что в качестве параметра он принимает список переменных и ключей с нулевым символом в конце. Поэтому, когда значение в вашем списке равно нулю, оно игнорирует остальные параметры.