Swift presentViewController 完成块仅在调试中工作而不在发布中调用

Posted

技术标签:

【中文标题】Swift presentViewController 完成块仅在调试中工作而不在发布中调用【英文标题】:Swift presentViewController completion block working only in debug not called in release 【发布时间】:2015-03-16 08:09:52 【问题描述】:

我在调试和发布中的完成块有一个奇怪的行为。 例如:

        sourceViewController.presentViewController(ccVC, animated: true, completion:  () -> Void in
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: kChromeCastInstructionsShown)
            NSUserDefaults.standardUserDefaults().synchronize()
            println("save bolean")
        )

在调试中: println("保存布尔值") 打印字符串 相对而言: println("save bolean") 不打印任何内容

对这种行为有任何想法吗? 有人试验了一个明确的解决方案?

种类 安德烈亚

【问题讨论】:

是的,同样的问题! 升级到 Xcode 6.3 解决了这个问题。 【参考方案1】:

它看起来是这里讨论的 Swift 编译器错误(至少 1.1 版): https://github.com/ReactiveCocoa/ReactiveCocoa/issues/1632

在发布版本中,有时不会调用闭包,尤其是当它们按如下顺序排列时:

array.map( $0 * 2 ).map( $0 * 3 ).map( $0 * 4 )...

该问题仅出现在 Swift 中,而不出现在 Objective-C 中。如果您的应用不需要通过优化获得更好的性能,可以通过将 Swift Compiler Optimization Level 设置为 None [-Onone] 来解决此问题。

或者另一种解决方法是将闭包命名为函数:

func completionHandler() 
    NSUserDefaults.standardUserDefaults().setBool(true, forKey: kChromeCastInstructionsShown)
    NSUserDefaults.standardUserDefaults().synchronize()
    println("save bolean")


sourceViewController.presentViewController(ccVC, animated: true, completion: completionHandler)

我对我的项目采用前一种解决方法,因为我想保持我的代码简单并且不需要通过优化来提高性能。

【讨论】:

将近 2 年后你救了我!【参考方案2】:

我在 xcode 7 中发现了同样的问题。 例如

  let delay = 0.2 * Double(NSEC_PER_SEC)
  let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

            dispatch_after(time, dispatch_get_main_queue(), 



            )

仅当我还设置了优化级别 None[-OO]

时才有效

【讨论】:

以上是关于Swift presentViewController 完成块仅在调试中工作而不在发布中调用的主要内容,如果未能解决你的问题,请参考以下文章

Swift Playground:让 ViewController 调用 presentViewController

Swift Bridging-Header Objective-C presentViewController

Swift presentViewController 完成块仅在调试中工作而不在发布中调用

swift presentViewController 以编程方式在destinationVC VDL中找到nil

PresentViewController 故障排除

Swift3.0:照片选择