Ios iCloud使用UIDocument崩溃保存数据
我正在尝试使用iCloud存储我的应用程序的用户设置,以下是我的保存和加载代码:,它通常运行正常,但有时会出现如下消息:尝试打开或还原已在运行中执行打开或还原操作的文档或发送到dealloc实例,因此我在openWithCompletionHandler之前添加文件状态日志它始终显示state=UIDocumentStateClosed,无论是否会崩溃,我在AppleCationdEnterBackground时保存数据,在AppleCationdDecomeActive时加载数据 保存: 负载: 如中所述,如果应用程序连续两次尝试调用[document openWithCompletionHandler:]方法,则会发生错误 由于openWithCompletionHandler:异步打开文档,因此再次调用该方法时,文档可能仍在打开Ios iCloud使用UIDocument崩溃保存数据,ios,icloud,uidocument,Ios,Icloud,Uidocument,我正在尝试使用iCloud存储我的应用程序的用户设置,以下是我的保存和加载代码:,它通常运行正常,但有时会出现如下消息:尝试打开或还原已在运行中执行打开或还原操作的文档或发送到dealloc实例,因此我在openWithCompletionHandler之前添加文件状态日志它始终显示state=UIDocumentStateClosed,无论是否会崩溃,我在AppleCationdEnterBackground时保存数据,在AppleCationdDecomeActive时加载数据 保存: 负载
如果发生这种情况,您的应用程序将尝试打开文档两次(因为文档状态将保持UIDocumentStateClosed直到完成),这将导致引发异常。我已通过更改代码解决了此问题,但当我编写[loadDocument saveToURL:documentURL for SaveOperation:UIDocumentSaveForCreating completionHandler:nil]在ApplicationIdentinterBackground,我的文件有时无法与iCloud同步
-(void)storeToiCloud{
NSURL *baseURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (baseURL) {
NSURL *documentsURL = [baseURL URLByAppendingPathComponent:@"Documents"];
NSURL *documentURL = [documentsURL URLByAppendingPathComponent:[NSString stringWithFormat:@"userSetting"]];
if (!loadDocument) {
self.loadDocument = [[MyUserDefaultsDocument alloc] initWithFileURL:documentURL];
}
loadDocument.myUserDefault = [MyUserDefaults standardUserDefaults];
[loadDocument saveToURL:documentURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
}];
}
}
-(BOOL)shouldSynciCloud{
if (![Utility iCloudEnable]) {
return NO;
}
NSURL *baseURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (baseURL) {
self.query = [[[NSMetadataQuery alloc] init] autorelease];
[self.query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == 'userSetting'", NSMetadataItemFSNameKey];
[self.query setPredicate:predicate];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(queryDidFinish:) name:NSMetadataQueryDidFinishGatheringNotification object:self.query];
[self.query startQuery];
[Utility showSpinner];
return YES;
}
return NO;
}
- (void)queryDidFinish:(NSNotification *)notification {
NSMetadataQuery *query = [notification object];
// Stop Updates
[query disableUpdates];
// Stop Query
[query stopQuery];
[query.results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSURL *documentURL = [(NSMetadataItem *)obj valueForAttribute:NSMetadataItemURLKey];
if([[documentURL lastPathComponent] hasPrefix:@"userSetting"]){
self.document = [[MyUserDefaultsDocument alloc] initWithFileURL:documentURL];
NSString* message;
if (document.documentState == UIDocumentStateNormal){
message = @"UIDocumentStateNormal";
}else if (document.documentState == UIDocumentStateClosed) {
message = @"UIDocumentStateClosed";
}else if(document.documentState == UIDocumentStateEditingDisabled){
message = @"UIDocumentStateEditingDisabled";
}else if(document.documentState == UIDocumentStateInConflict){
message = @"UIDocumentStateInConflict";
}else if(document.documentState == UIDocumentStateSavingError){
message = @"UIDocumentStateSavingError";
}
NSLog(@"state = %@",message);
[document openWithCompletionHandler:^(BOOL success) {
if (success) {
MyUserDefaults *prefs = [MyUserDefaults standardUserDefaults];
NSData *book =[document.myUserDefault.realDict objectForKey:@"realbook"];
NSData *readSetting = [document.myUserDefault.realDict objectForKey:@"epubRS"];
if (book&&[[NSUserDefaults standardUserDefaults] boolForKey:@"iCloudBook"]) {
[prefs setObject:book forKey:@"realbook"];
[Utility reloadRealBooks];
}
if (readSetting&&[[NSUserDefaults standardUserDefaults] boolForKey:@"iCloudSetting"]) {
[prefs setObject:readSetting forKey:@"epubRS"];
[Utility setEpubReadSettingFromData:readSetting];
}
[prefs save];
[[NSNotificationCenter defaultCenter]postNotificationName:@"iCloudSynced" object:nil];
[Utility removeSpinner];
}
else{
[[NSNotificationCenter defaultCenter]postNotificationName:@"iCloudSyncfailed" object:nil];
[Utility removeSpinner];
}
}];
}
}];
if ([query.results count]==0) {
[[NSNotificationCenter defaultCenter]postNotificationName:@"iCloudSyncfailed" object:nil];
[Utility removeSpinner];
}
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:nil];
}