我的 CompletionHandler 不会执行。为啥?
Posted
技术标签:
【中文标题】我的 CompletionHandler 不会执行。为啥?【英文标题】:My CompletionHandler will not execute. Why?我的 CompletionHandler 不会执行。为什么? 【发布时间】:2018-08-03 12:35:34 【问题描述】:我有以下代码:
document?.open success in
if success
print("file opened")
self.consumed = self.document?.consumed
else
print("file read failure")
可以看出,我有一个成功和失败的打印。但都没有打印出来。
合理的问题是文件不存在,不可读或其他什么。因此,我在这段代码之前添加了以下内容:
if document != nil
print("not nil")
let asString = document?.fileURL.path
let toast = FileManager.default.fileExists(atPath: asString!)
if toast
print("file exist")
else
print("file does not exist")
else
print("nil")
if FileManager.default.isReadableFile(atPath: (document?.fileURL.path)!)
print("readable")
else
print("not readable")
这对我来说表明它是:不为零,存在且可读。
有时我会错过不执行此完成代码吗?能够打开文件会很棒,但我认为它没有运行的事实是第一步。
关于文件的注意事项。它是从包中读取并复制到 Documents 目录的文件。我查看了文件的属性,并没有发现任何异常。
【问题讨论】:
方法open
可能有问题。
要么你的document
是实际上 nil
要么你正在使用一个不能被认为是可靠的beta SDK,因为它是测试版.
但我的测试证明它不是零。
如果document
是nil
,则代码可靠地崩溃。
还有一个问题。会不会是副本的问题?我一直在寻找一些版本以确保文件可用。这在 Swift 中似乎没有必要。无论如何,我怀疑副本没有完成或以某种方式损坏了文件。然而,到目前为止,对属性的评估一无所获,
【参考方案1】:
尝试将document?.open
替换为document!.open
,或者使用保护让来真正确保文档不为零。因为如果 document
为 nil,则整个调用将被跳过。
Here 你可以阅读可选链。
【讨论】:
document!.open 没有不同的行为。不确定我是否知道如何将守卫与 completionHandler 一起使用。 @jz_ 嗯,这很奇怪。守卫会检查该文件不是零。什么类型的文档? 目的,文档是保存为自定义 UTI 格式的 JSON 文件。这就是你要问的。我想,一项检查是返回到 JSON ext 并以这种方式阅读,看看自定义名称是否是问题。 你在 UTI 格式上迷失了我,但如果打开确实可以自定义打开的东西,当然也可能是罪魁祸首。 基本上你可以声明自己的扩展类型。以上是关于我的 CompletionHandler 不会执行。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
textFieldShouldReturn - completionHandler 中的某些方法永远不会被调用
在 Alamofire Swift 2.2 中使用 completionHandler
AVAsset loadValuesAsynchronouslyForKeys:completionHandler 从不执行