2016-09-19 15 views
0

私のCocoaアプリケーションでは、プロパティが変更されるべきではないときにプロパティが変更されます。何が起こるかを知るために、私は問題を絞り込むのに役立つアサーションを入れました(私は「変数を見る」ように試みましたが、どのように使用されているか理解できませんでした)。しかし今、私はそれが想定していたものとは反対のような主張に直面しています(スクリーンショット参照)。アサーションは失敗する必要がある場所で失敗します。なぜですか?

コードを別のスレッドで実行するには、カスタム演算子(下記参照)を使用しています。

私は何が欠けていますか、そして私は前進するために何ができますか?

State of Xcode when the program crashes. プログラムがクラッシュしたときのXcodeの状態。

Stack trace. スタックトレース。

import Foundation 
infix operator ~> 

/** 
Executes the lefthand closure on a background thread and, 
upon completion, the righthand closure on the main thread. 
Passes the background closure's output, if any, to the main closure. 
*/ 
func ~> <R> (
    backgroundClosure: @escaping() -> R, 
    mainClosure:  @escaping (_ result: R) ->()) 
{ 
    queue.async { 
     let result = backgroundClosure() 
     DispatchQueue.main.async { 
      mainClosure(result) 
     } 
    } 
} 

private let queue = DispatchQueue(label: "Edk4ServerRequests") 

カスタムオペレータの定義。 (コードはhttps://ijoshsmith.com/2014/07/05/custom-threading-operator-in-swift/から適合)

+0

を変更される際に実行が停止されます私はサンプルで使用されるカスタム「〜>」演算子に関する重要な情報を追加しました。 –

+0

私は 'isUpdating'が別のスレッドによって変更されないようにコードを書き直しました。それでも、スクリーンショットでは、アサーションが失敗したときに 'isUpdating'の値がデバッガによって' false'と表示されることを理解したいと思います。 –

答えて

1

属性宣言にブレークポイントを追加できます。属性値が

enter image description here

+0

これは役に立ちます。私は "private var isUpdating:Bool"(あなたが意味するものではないか)にブレークポイントを設定しようとしましたが、再度実行しましたが、何も変わりませんでした。 –

+0

それだけです。あなたの 'isUpdating'が変更されると、実行は停止されます – CZ54

+0

まあ、それは停止しません。ただし、グローバル変数にブレークポイントを設定しても停止します。 –

関連する問題