iCloud - UIDocument saveToUrl 不执行完成块

Posted

技术标签:

【中文标题】iCloud - UIDocument saveToUrl 不执行完成块【英文标题】:iCloud - UIDocument saveToUrl does not execute completion block 【发布时间】:2013-04-11 10:27:51 【问题描述】:

前几天我正在使用它进行测试,它正在工作。今天调用了这个方法之后,就再也没有调用完成块了。

是否存在不调用完成块的情况?我记得 Apple 说过不管发生什么事情都会调用它。

这是代码块:

dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) 
            // Get ubiquitous url
            NSURL *ubiq = [[NSFileManager defaultManager]
                           URLForUbiquityContainerIdentifier:nil];
            NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:
                                         @"Documents"] URLByAppendingPathComponent:fileName];

            // Create new CloudFile
            CloudFile *file = [[CloudFile alloc]initWithFileURL:ubiquitousPackage];
            file.data = data;
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDocumentStateChanged:) name:UIDocumentStateChangedNotification object:file];             

            dispatch_async (dispatch_get_main_queue (), ^(void) 
                [file saveToURL:file.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) 
                    NSLog(@"test");
                    if (success) 
                        [self sendEvent:ICLOUD_FILE_SAVE_SUCCESSFUL object:file];
                     else 
                        [self sendEvent:ICLOUD_FILE_SAVE_FAILED];
                        NSLog(@"kaiCloud: Saving failed. (%@)",fileName);
                    

                ];
            );

        );

编辑:请注意,我添加了 NSLog(@"test") 并没有看到它被记录。

【问题讨论】:

保存真的发生了吗? 没有。我在 iCloud 中没有看到它。奇怪的是我没有更改代码中的任何内容,在我回来后,它不再工作了。 您能否在内部dispatch_async 之前和文件保存之前(内部异步调用内部)添加要打印的日志file 下周我会记录下来。我现在不在工作,所以我无法测试。但是,由于某种原因,它似乎不适用于特定设备。我用其他 3 台设备进行了尝试,它可以工作。不过,我认为我不应该收到任何回调(我会在回来后检查它)。 我无法再重现该错误。那很奇怪。无论如何,我得到了它的工作。 【参考方案1】:

我遇到了同样的问题(这就是我发现你的问题的方式)。

原因很简单。测试代码不会等待调用完成处理程序,当然也不会等待它完成执行。

如果测试时间足够长或碰巧停止,您的测试有时可能会奏效。但这并不可靠。

使用此处提供和解释的 WAIT 宏并解决问题。

https://github.com/hfossli/AGAsyncTestHelper

【讨论】:

以上是关于iCloud - UIDocument saveToUrl 不执行完成块的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7:UIDocument / UIManagedDocument 和 iCloud 发生了啥?

在进入后台时将 UIDocument 上传到 iCloud

iCloud保存数据与UIDocument崩溃

使用 setUbiquitous 为 UIDocument 文件关闭 iCloud 同步时出错(LibrarianErrorDomain 错误 2)

现有的 UIDocument 不会在 iCloud 上更新

当应用程序在后台时,如何检查我的 UIDocument 是不是已通过 iCloud 更新?