5

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

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

在调试中: println("save bolean") 打印字符串 在 relase 中: println("save bolean") 不打印

关于这种行为的任何想法?有人尝试一个明确的解决方案?

善良的安德里亚

4

2 回答 2

10

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

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

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

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

截屏

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

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

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

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

于 2015-03-16T09:10:10.463 回答
0

我在 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] 时才有效

于 2015-09-18T15:35:07.500 回答