2011-03-30 6 views
2

drawRect:のURLの画像をロードしようとしています。私たちの画像読み込みコードは、次のようなメソッドです:- (void) loadImage:(NSURL*)url done:(void(^)(UIImage*))done;、非同期NSURLConnectionを作成し、画像をコールバックします。drawRectでGCD /非同期コードを使用する:

だから、drawRect:での私のコードは次のようになります。

CGContextRef context = UIGraphicsGetCurrentContext() 
[service loadImage:url done:^(UIImage * image){ 
    CGContextDrawImage(context, frame, image.CGImage); 
}]; 

残念ながら、これは動作しません。イメージは決して描かれません。

私はまた、同期接続([NSData dataWithContentsOfUrl:])を使ってみましたが、スレッドをブロックし、不必要に処理を遅らせます。私はUIImageViewを使いたくありません。

これを行う正しい方法は何ですか?ありがとう!

+0

この問題の解決方法を教えてください。私は同じ問題を抱えています。ありがとう – Vjy

答えて

3

"setNeedsDisplayInRect:"を呼び出すか、独自の描画処理を別の方法で実行すると、すぐにイメージをロードするか、イメージを描画することが正しい方法だと思います(iOSによってこれをやって、私はわからない)。明らかに、setNeedsDisplayInRectバリエーションでは、2度目の描画(キャッシュ)のためにイメージを手元に置く必要があります。

イメージを非同期にロードすると、イメージがロードされる前にdrawRectメソッドが終了してdrawRectでドローフォーカスがロックされなくなり、コンテキストでイメージを描画できなくなります。あなたはこれを確認するためにブレークポイントを設定しようとしましたか?私はロッキングについて間違っているかもしれないが、私はこれと同じように何かを読んだと思った。

0

私がしようと最初にすることは、非同期ハンドラは、メインスレッド上で動作することを確認することです。

[service loadImage:url done:^(UIImage * image) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     CGContextDrawImage(context, frame, image.CGImage); 
    }); 
}]; 

それが解決しない場合、私はコンテキストがまだ有効であるかどうか疑問を開始します。ポインタはありますが、コンテキストはおそらくそうではありません。おそらくコンテキスト取得をハンドラに移すことができるかもしれません:APIには意味があるかどうかは分かりませんが、このようなことはあまりありません。

+0

うまくいきません、私は恐れています。ありがとう!他のポスターは、後で利用可能な有効なコンテキストがないという点で正しいものでした。 –

3

考えてみてください - なぜになるのですか?ブロックが入力される時点までに、contextが現在のコンテキスト(またはバッキングストアが完全に有効であることさえ)がまだ保証されているという保証はありません。ブロックまたはデリゲートメソッドなどの非同期コールバックを使用することで、意図的に後でコードを延期することになります。 -drawRect:への呼び出しが終了し、ブロックが入力されるずっと前にスタックから外されています。

0

あなたが試してみました:

__block CGContextRef context = UIGraphicsGetCurrentContext() 
[service loadImage:url done:^(UIImage * image){ 
    CGContextDrawImage(context, frame, image.CGImage); 
}]; 

をあなたがブロックを返すときに、それが修正すべきか文脈とフレーム知っている、フレームと同じことを行う必要があります。

関連する問題