不确定是否有人仍然需要解决方案,但我找到了一个很好的方法来让它工作。
由于 UIDocument 只接受作为 NSData 或 NSFilewrapper 的数据,所以我首先为 NSDictionary 类创建了一个 Category,它从 NSData 返回一个 NSDictionary。这是类别的两个文件:
NSDictionary+DictFromData.h:
#import <Foundation/Foundation.h>
@interface NSDictionary (DictFromData)
+ (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end
和 NSDictionary+DictFromData.m
#import "NSDictionary+DictFromData.h"
@implementation NSDictionary (DictFromData)
+ (id)dictionaryWithData:(NSData *)data {
return [[[NSDictionary alloc] initWithData:data] autorelease];
}
- (id)initWithData:(NSData *)data {
NSString *tmp = nil;
self = (NSDictionary *)[NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListImmutable
format:NULL
errorDescription:&tmp];
NSAssert1(tmp == nil,@"Error in plist: %@",tmp);
return [self retain];
}
@end
(来源)
如果你现在在你的 UIDocument 子类中导入这个类别,你可以轻松地加载你的 Plist 文件并将其保存到你的 iCloud 容器中。
要从 iCloud 加载您的 Plist,请将其添加到您的 UIDocument 子类(属性内容是 NSDictionary):
- (BOOL)loadFromContents:(id)contents
ofType:(NSString *)
typeName error:(NSError **)outError {
if ([contents length] > 0){
self.contents = [NSDictionary dictionaryWithData:contents];
} else {
self.contents = nil;
}
// call some Methods to handle the incoming NSDictionary
// maybe overwrite the old Plist file with the new NSDictionary
return YES;
}
要将您的数据保存回 iCloud,请添加以下内容:
- (id)contentsForType:(NSString *)typeName error:(NSError **)outError {
NSData * plistData = [[[NSData alloc]initWithContentsOfFile:YOUR_PLIST_FILE]autorelease];
return plistData;
}
如果你现在打电话:
[myUIDocument updateChangeCount:UIDocumentChangeDone];
YOUR_PLIST_FILE 正在同步。请记住,您的 iCloud 容器更新大约需要 10-15 秒。