2016-04-25 38 views
0

私は、UIViewControllerのビューの一番上にビューを追加するだけのプロジェクトでバグがあります。卓越した何も、このようなものは:UI操作がメインスレッド上で実行されているにもかかわらず、UIグリッチが発生する

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    self.displayEmailNotificationsIfNeeded() 
} 

バグが何らかの理由で自動レイアウトが正しく動作し、上部にそれを追加しませんが、周り60pt必要よりも低いということではありません。ナビゲーション・バーとステータス・バーを含めるために、手動でトップ・コンストレインを調整して〜60ptが得られると思われますが、それは本当に重要ではありません。

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    print("is main thread: ", NSThread.isMainThread()) 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     print("is main thread inside block: ", NSThread.isMainThread()) 
     self.displayEmailNotificationsIfNeeded() 
    }) 
} 

print文は両方のケースのためtrueを返す:

事実は、私はこのように、メインキューに明示的にメソッドを実行する場合、問題が消えていることです。それは本当にひどいことではありませんが、私はこれを引き起こす原因を理解したいだけです。この状況をデバッグして、主なスレッドで明示的に操作を実行する理由がいくつかのUIの不具合を修正する方法はありますか?

答えて

1

教育的な推測 - それは明示的にキューに追加することなく、displayEmailNotificationsIfNeededがメインスレッド上で実行されているわけではありません。タイミングはもっと重要です。 viewDidAppearの実行が終了すると、ストーリーボード内の他の制約の結果、別の状態にある要素が移動している可能性があります。実行ブロックを非同期で追加すると、コードを実行する前にviewDidAppearが終了します(メインキューで同期して実行されているもの)。

これが役に立ちます。

0

これは私がバグを再現する必要があるため、特定の答えではありませんが、ここには私が起こっていると思われることがあります。

コードを直接実行すると、レイアウトが完全に準備されていない(別のコードに依存するため)レイアウトが間違っています。 dispatch_asyncで明示的にコードを実行すると、それもメインスレッドで実行されますが、後の時点でレイアウトが準備完了になり、正しい結果が表示されます。

また、このコードを実行すると、理解できるはずです。

print("1"); 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     print("2"); 
    }) 
    print("3"); 
0

viewWillLayoutSubviews()で実行してみてください。ビューコントローラ.viewは、この時点で完全にレイアウトされている必要があります。このメソッドは複数回呼び出すことができます(例:.viewがサイズ変更された場合)。

関連する問題