【发布时间】:2012-01-30 05:39:57
【问题描述】:
从 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 之后,有一个检查布尔值的循环,如下所示:
while (!cloudDidFinishLoad)
{
sleep(10);
}
这个布尔值被初始化为假,并且在上面看到的“replaceDocumentInSandboxWith”函数中,布尔值被设置为真。
但是,我发现这会导致程序挂起,它永远不会完成加载 iCloud 文件,并且永远不会调用完成处理程序。
我不知道该怎么做。我需要程序停止运行代码,直到下载完成,但我不知道该怎么做。
【问题讨论】: