Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iCloud使用UIDocument崩溃保存数据_Ios_Icloud_Uidocument - Fatal编程技术网

Ios iCloud使用UIDocument崩溃保存数据

Ios iCloud使用UIDocument崩溃保存数据,ios,icloud,uidocument,Ios,Icloud,Uidocument,我正在尝试使用iCloud存储我的应用程序的用户设置,以下是我的保存和加载代码:,它通常运行正常,但有时会出现如下消息:尝试打开或还原已在运行中执行打开或还原操作的文档或发送到dealloc实例,因此我在openWithCompletionHandler之前添加文件状态日志它始终显示state=UIDocumentStateClosed,无论是否会崩溃,我在AppleCationdEnterBackground时保存数据,在AppleCationdDecomeActive时加载数据 保存: 负载

我正在尝试使用iCloud存储我的应用程序的用户设置,以下是我的保存和加载代码:,它通常运行正常,但有时会出现如下消息:尝试打开或还原已在运行中执行打开或还原操作的文档或发送到dealloc实例,因此我在openWithCompletionHandler之前添加文件状态日志它始终显示state=UIDocumentStateClosed,无论是否会崩溃,我在AppleCationdEnterBackground时保存数据,在AppleCationdDecomeActive时加载数据

保存:

负载:

如中所述,如果应用程序连续两次尝试调用[document openWithCompletionHandler:]方法,则会发生错误

由于openWithCompletionHandler:异步打开文档,因此再次调用该方法时,文档可能仍在打开


如果发生这种情况,您的应用程序将尝试打开文档两次(因为文档状态将保持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];
}