我的 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,因为它是测试版. 但我的测试证明它不是零。 如果documentnil,则代码可靠地崩溃。 还有一个问题。会不会是副本的问题?我一直在寻找一些版本以确保文件可用。这在 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 从不执行

NIO2 CompletionHandler 的线程安全

Alamofire completionHandler 更新 ui 仅在函数完成时有效

Swift 3 中带有异步调用的 CompletionHandler