Не уверен, что кому-то еще нужно решение для этого, но я нашел хороший способ заставить это работать.
Поскольку UIDocument принимает данные только как NSData или NSFilewrapper, я сначала создал категорию для класса NSDictionaryкоторый возвращает NSDictionary из NSData.Вот два файла для категории:
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.
Чтобы загрузить Plist из iCloud, добавьте это вВаш подкласс 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 секунд.