无法在已写入文件的NSDictionary中检索NSData

时间:2013-11-08 11:48:35

标签: ios objective-c nsdictionary uiactivityviewcontroller

我有一个NSData对象,我放在字典里面。然后我将字典写入文档目录。然后我立即将该文件的URL提供给uiactivityviewcontroller,以便在Mail应用程序中包含它以便附件。

问题是,当用户单击此文件以导入到应用程序时,除了NSData对象之外,字典中的所有内容都可用(还有其他NSString对象)!当我测试以查看应该保存NSData对象的相关键的对象内部时,它返回(null)..

以下是代码的相关部分(为了清楚起见,我简化了一些部分,但它基本上是相同的代码):

    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

当应用程序打开时,我只是从文件中加载字典,并尝试从“dataobj”键中检索nsdata对象..但它返回null。

-(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 个答案:

答案 0 :(得分:0)

谢谢你在我的问题评论的帮助下解决了它。

问题在于,由于nil值,文件在某些​​情况下没有写入磁盘。

如果字典中有任何引用nil项的键,则字典将不会写入文件。通过检查我想要包含在字典中的每个对象是否为nil来解决了这个问题,如果它是nil,那么我会从字典中省略它以确保它写入文件。

例如

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:]。您将在文档中找到它作为参数的交替值和键的以空值终止的列表。因此,当列表中的值为零时,它将忽略其余参数。