gpt4 book ai didi

ios - 如何检测 iCloud 是否已完成文档下载以及运行完成处理程序?

转载 作者:行者123 更新时间:2023-11-29 13:42:39 25 4
gpt4 key购买 nike

从 iCloud 加载文档时,必须调用

openWithCompletionHandler:^(BOOL success)completionHandler

此函数将启动一个从 iCloud 下载文件的后台线程,并在完成加载后运行完成处理程序。

在此期间,此调用后的任何代码都将继续运行。

如何阻止程序在下载完成之前继续运行?

在调用从云端加载后,我的代码立即尝试使用该文档 - 当然,由于它没有完成下载,代码崩溃了。

详情如下:

我目前正在开发一个保存文件库来处理文件的保存/加载、加密、压缩和 iCloud 支持。用户调用我的库函数 LoadFileAtPath 并且有一个参数指定他们是否要我检查 iCloud 中的这个特定文件。

当该函数启动并且我打算检查 iCloud 时,我做的第一件事就是调用我的 iCloudload 函数,如下所示:

bool cloudLoad = [iCloudStorageManager readFileFromiCloud:filePath name:fileName];

在此函数中,我调用了 openWithCompletionHandler,如下所示:

if ([fileManager fileExistsAtPath:[docURL path]]) 
{
[doc openWithCompletionHandler:^(BOOL success){
if (!success)
{
// Handle the error.
NSLog(@"Failed to retrieve document:%@ from iCloud URL:%@.", fileName, [docURL absoluteString]);
}
else
{
NSLog(@"Replacing document in sandbox with iCloud version");
BOOL* dir = nil;
if (![fileManager fileExistsAtPath:filePath isDirectory:dir])
{
NSError *fileError = nil;
if(![fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&fileError])
{
NSLog(@"Error creating file directory: %@\n%@\n%@\n%@", [fileError localizedDescription], [fileError localizedFailureReason], [fileError localizedRecoveryOptions], [fileError localizedRecoverySuggestion]);
}

}
// save new data if success
[iCloudStorage replaceDocumentInSandboxWith:doc newData:doc.loadedContents];
}
}];
[doc release];
}

之后,我的代码继续尝试提取数据,并对其执行各种操作,例如解密、解压缩并将文件数据交给调用者。

我当前的(hacky)解决方案是,在初始调用 readFileFromiCloud 之后,有一个检查 bool 的循环,如下所示:

while (!cloudDidFinishLoad) 
{
sleep(10);
}

这个 bool 被初始化为 false,并且在上面看到的“replaceDocumentInSandboxWith”函数中,bool 被设置为 true。

但是,我发现这会导致程序挂起,它永远不会完成加载 iCloud 文件,并且永远不会调用完成处理程序。

我不知道我应该做什么。我需要程序在下载完成之前停止运行代码,但我不知道该怎么做。

最佳答案

不确定您是否找到了这个问题的答案,但我要做的是为您的库创建一个协议(protocol),然后设置一个委托(delegate),您可以在完成处理程序完成时调用它。

然后在您的主 Controller 中可以设置为委托(delegate),一旦文件准备就绪,您就可以收到来自库的调用,表明文件已准备好使用。所以伪代码应该是这样的……

  1. 创建 iCloudStorageManager
  2. 将自己设置为 iCloudStorageManager 的委托(delegate)
  3. 调用 iCloudStorageManager 打开文件
  4. 在这里做任何您需要做的事情,设置事件指示器或锁定界面或两者都不做,并假设它有效,除非代表告诉您它没有。基本上,您的 block 将在这里结束,当委托(delegate)函数被调用时,您的主 Controller 将重新获得对界面的控制。

  5. 在委托(delegate)函数中,您将从 iCloudStorageManager 接收成功与否的状态。一旦您从 iCloudStorageManager 收到该调用,您就可以释放界面,发布一切顺利或一切不顺利的警报,并提供回复……无论您想要做什么。

但这就是我处理它的方式。 (是的,这是一个老问题,但我觉得我有一些见识:))

关于ios - 如何检测 iCloud 是否已完成文档下载以及运行完成处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com