2012-03-31 11 views
8

ので、this answerにしてthe iOS 4.0 release notesで述べたように、UIKitには現在、いくつかのスレッドセーフな描画機能があります。UIKit描画はスレッドセーフです。どのようにグラフィックスコンテキストを取得しますか?

UIKitのグラフィックスコンテキストに描画すると、今、スレッドセーフです。具体的には

  • グラフィックスコンテキストにアクセスして操作するためのルーチンは、異なるスレッドに存在するコンテキストを正しく処理できるようになりました。
  • 文字列とイメージの描画がスレッドセーフです。
  • 複数のスレッドでカラーオブジェクトとフォントオブジェクトを使用するのが安全です。

これは素晴らしいですが、どのように使用しますか?

限り、私は承知しているとして、任意の時間はあなたがUIGraphicsBeginImageContext()UIGraphicsPushContext()を通して、あなた自身のコンテキストを作成した場合のみのUIKit/UIGraphicsのものを使用して描画することができ-drawRect:内じゃないが、これらの関数はスレッドセーフではありませんドキュメントによると、-drawRect()は常にメインスレッドで呼び出されます。

私は主なスレッドでイメージコンテキストを作成し、バックグラウンドメソッドを開始することは、競合状態が十分にあるため、本当に悪い考えです。

iOS 4で導入されたこのマルチスレッドUIKitベースの描画はどのように使用しますか?アクティブなUIKitグラフィックスコンテキストを取得する他の方法はありませんでしたか?

P.S.私はCore Graphicsを使って描画し、それを使って作業することができることを知っています。さまざまな理由(旧来のコード)のために、私はUIKitベースの描画メソッドを使い続けたいと思います。

答えて

8

私は、それを試した経験やさまざまな文書に基づいて、UIGraphicsPushContext()のドキュメントが間違っていると考えています。

私はUIGraphicsPushContext()が実際にスレッドセーフであると信じています。これが本当であることを示す具体的なメッセージはQA1637です。「iOS 4.0以降、UIKitのグラフィックスコンテキストへの描画はスレッドセーフです。現在のグラフィックススタックへのアクセスと操作、画像と文字列の使用、カラーとフォントオブジェクトをセカンダリスレッドから削除します。 (重点鉱山)

私は、ドキュメントと矛盾してスレッドの安全性を仮定するのは、常に厄介な命題であることを認めます。しかし、私はこれがドキュメントのエラーだと思う。私はそれを追跡するためにrdar://11161530を開いた。捨ててください。

+0

私は実際にこれについてDTSの問題を開いたので、うまくいけばそこから見つけることができます。私が質問で言及しなかったのは、私の試行では(beginImageContextを使っていましたが)、ほとんどのことがうまくいきましたが、時々NSStringのdrawInRect:withFont: 'にクラッシュしていました。それは面倒なことに再現性がありませんが、クラッシュしたときはいつでもそれがあります。私は何かが間違っている場合、またはこれが決してうまくいかない場合、私は解決しようとしています。 –

+0

私はこの種のクラッシュを以前は見たことがありませんでしたが、私は実験で過度に攻撃的ではありませんでした。これは非常に邪魔になり、私の信念が間違っていることを示唆するかもしれません。 DTSの成果をお知らせください。 –

+0

詳細:クラッシュする特定のものは 'WebCore :: FontFallbackList ::〜FontFallbackList()()'です。 –

関連する問題