5

デバッグとリリースの完了ブロックで奇妙な動作があります。例えば:

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

デバッグ時: println("save boreal") print string リリース時: println("save boreal") 何も出力しない

この動作について何か考えはありますか?誰かが明確な解決策を試していますか?

親切なアンドレア

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 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)

コードをシンプルに保ち、最適化によるパフォーマンスの向上を必要としないため、プロジェクトでは前者の回避策を採用しています。

于 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(), {



            })

optimimizazion レベル None[-OO] も設定した場合にのみ機能します

于 2015-09-18T15:35:07.500 に答える