- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从 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),一旦文件准备就绪,您就可以收到来自库的调用,表明文件已准备好使用。所以伪代码应该是这样的……
在这里做任何您需要做的事情,设置事件指示器或锁定界面或两者都不做,并假设它有效,除非代表告诉您它没有。基本上,您的 block 将在这里结束,当委托(delegate)函数被调用时,您的主 Controller 将重新获得对界面的控制。
在委托(delegate)函数中,您将从 iCloudStorageManager 接收成功与否的状态。一旦您从 iCloudStorageManager 收到该调用,您就可以释放界面,发布一切顺利或一切不顺利的警报,并提供回复……无论您想要做什么。
但这就是我处理它的方式。 (是的,这是一个老问题,但我觉得我有一些见识:))
关于ios - 如何检测 iCloud 是否已完成文档下载以及运行完成处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674037/
从 Redis 获取消息时,onDone:(){print('done')} 从未起作用。 import 'package:dartis/dartis.dart' as redis show PubS
昨天我玩了一些vim脚本,并设法通过循环来对当前输入的内容进行状态栏预测(请参见屏幕截图(灰色+黄色栏))。 问题是,我不记得我是怎么得到的,也找不到我用于该vim魔术的代码片段(我记得它很简单):它
我尝试加载 bash_completion在我的 bash (3.2.25) 中,它不起作用。没有消息等。我在我的 .bashrc 中使用了以下内容 if [ -f ~/.bash_completio
我正在尝试构建一个 bash 完成例程,它将建议命令行标志和合适的标志值。例如在下面 fstcompose 命令我想比赛套路先建议 compose_filter= 标志,然后建议来自 [alt_seq
当我尝试在重定向符号后完成路径时,bash 完成的行为就好像它仍在尝试在重定向之前完成命令的参数一样。 例如: dpkg -l > /med标签 通过在 /med 之后点击 Tab我希望它完成通往 /
我的类中有几个 CAKeyframeAnimation 对象。 他们都以 self 为代表。 在我的animationDidStop函数中,我如何知道调用来自哪里? 是否有任何变量可以传递给 CAKe
我有一个带有 NSDateFormatter 的 NSTextField。格式化程序接受“mm/dd/yy”。 可以自动补全日期吗?因此,用户可以输入“mm”,格式化程序将完成当前月份和年份。 最佳答
有一个解决方案可以使用以下方法完成 NSTextField : - (NSArray *)control:(NSControl *)control textView:(NSTextView *)tex
我正在阅读 Passport 的文档,我注意到 serialize()和 deserialize() done()被调用而不被返回。 但是,当使用 passport.use() 设置新策略时在回调函数
在 ubuntu 11.10 上的 Firefox 8.0 中,尽管 img.complete 为 false,但仍会调用 onload 函数 draw。我设法用 setTimeout hack 解决
假设我有两个与两个并行执行的计算相对应的 future 。我如何等到第一个 future 准备好?理想情况下,我正在寻找类似于Python asyncio's wait且参数为return_when=
我正在寻找一种 Java 7 数据结构,其行为类似于 java.util.Queue,并且还具有“最终项目已被删除”的概念。 例如,应可以表达如下概念: while(!endingQueue.isFi
这是一个简单的问题。 if ($('.dataTablePageList')) { 我想做的是执行一个 if 语句,该语句表示如果具有 dataTablesPageList 类的对象也具有 menu
我用replaceWith批量替换了许多div中的html。替换后,我使用 jTruncate 来截断文本。然而它不起作用,因为在执行时,replaceWith 还没有完成。 我尝试了回调技巧 ( H
有没有办法调用 javascript 表单 submit() 函数或 JQuery $.submit() 函数并确保它完成提交过程?具体来说,在一个表单中,我试图在一个 IFrame 中提交一个表单。
我有以下方法: function animatePortfolio(fadeElement) { fadeElement.children('article').each(function(i
我刚刚开始使用 AndEngine, 我正在像这样移动 Sprite : if(pValueY < 0 && !jumping) { jumping =
我正在使用 asynctask 来执行冗长的操作,例如数据库读取。我想开始一个新 Activity 并在所有异步任务完成后呈现其内容。实现这一目标的最佳方法是什么? 我知道 onPostExecute
我有一个脚本需要命令名称和该命令的参数作为参数。 所以我想编写一个完成函数来完成命令的名称并完成该命令的参数。 所以我可以这样完成命令的名称 if [[ "$COMP_CWORD" == 1 ]];
我的应用程序有一个相当奇怪的行为。我在 BOOT_COMPLETE 之后启动我的应用程序,因此在我启动设备后它是可见的。 GUI 响应迅速,一切正常,直到我调用 finish(),按下按钮时,什么都没
我是一名优秀的程序员,十分优秀!