2016-09-07 11 views
1

iOS7で奇妙な動作が見つかりました。私は重い負荷を処理するdispatch_asyncバックグラウンドスレッドがあり、このスレッドから私はUIを更新したい。 iOSの8日と示唆したが、iOS7テストデバイス上で実行されているとして上記のコードが動作する上でdispatch_async(dispatch_get_main_queue()、^ {});背景からスレッドが遅いiOS7で

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

    [self heavyFunction]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     [self updateUI]; 

    }); 
}); 

は(iPhone 4S)dispatch_async(dispatch_get_main_queue(), ^{});への呼び出しは毎回4秒をとります。だから私は、次のと同じようにしました。私はすでに更新とheavy_functionを外して、同じ動作が残っています。それから私はそれが現れない最小限の例を構築しました。だから私はおそらく他の何かが私のmain_queueをiOS7でブロックしていると思ったが、私はこれが何であるべきかを理解できない。 [self heavyfunction];が終了するまで、このViewControllerで起こっている他のUI関連のものはありません。

すべては、Base SDK 9.3とDeployment Target 7.0でXCode 7.3.1でコンパイルされます。

誰もがこの動作を既に持っていて、ここでブロックしている可能性のある方向に私を指摘できますか?

+1

時間プロファイラ計測器を使用しましたか? – Paulw11

+0

はい、私は持っていますが、ちょうど2秒の間、ループ内で '[UIView(Hierachy)layoutBelowIfNeeded]'を2回取得します。 –

+0

矛盾する制約についての警告はありますか? – Paulw11

答えて

0

だから、いくつかの研究の後、私は問題を発見した。バックグラウンドスレッドからバックグラウンドスレッドに通知(NSNotificationCenter以上)を呼び、この通知は2つの異なるViewControllerからキャッチされ、UITableViewsのデータソースを更新します。 2番目のもの(ハングしたもの)はNavigationController階層の最初のものの下にあります。

両方の通知が同時に処理され、最初の表示が全く表示されない場合でも、両方のコントローラでUIがリロードされます。しかし、これはちょうどiOS 7で起こっているようです。上記のiOSバージョンはすべて、見えないViewControllerからUIをリロードしないようです。

私がViewController間をジャンプすると、データソースがバックグラウンドスレッドから更新されるため、UIのすべてがどちらかの方法で更新されます。そのため、ブースViewControllerのどれが現在表示されているかを確認して、そのUIのUI。

iOS 7以上のすべてのバージョンのiOSがこの問題を自動的に処理するように見えますが、iOS 7ではこれが問題になります。

関連する問題