UIImageView サブビューを持つ UIView があります。UI をブロックせずに UIImageView に画像を読み込む必要があります。ブロッキング呼び出しは次のようです: UIImage imageNamed:
. これが私がこの問題を解決したと思ったものです:
-(void)updateImageViewContent {
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage * img = [UIImage imageNamed:@"background.jpg"];
dispatch_sync(dispatch_get_main_queue(), ^{
[[self imageView] setImage:img];
});
});
}
画像が小さい (150x100)。
ただし、画像をロードするときに UI はブロックされたままです。何が欠けていますか?
この動作を示す小さなコード サンプルを次に示します。
UIImageView に基づいて新しいクラスを作成し、そのユーザー インタラクションを YES に設定し、UIView に 2 つのインスタンスを追加し、その touchesBegan メソッドを次のように実装します。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.tag == 1) {
self.backgroundColor= [UIColor redColor];
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
[self setImage:[UIImage imageNamed:@"woodenTile.jpg"]];
});
[UIView animateWithDuration:0.25 animations:
^(){[self setFrame:CGRectInset(self.frame, 50, 50)];}];
}
}
タグ 1 をこれらの imageView の 1 つに割り当てます。
画像をロードするビューから始めて、2 つのビューをほぼ同時にタップすると、正確には何が起こるでしょうか? 返されるのを待っているため、UI がブロックされ[self setImage:[UIImage imageNamed:@"woodenTile.jpg"]];
ますか? もしそうなら、どうすればこれを非同期に行うことができますか?
これは、 ipmccコードを使用したgithubのプロジェクトです
長押ししてからドラッグし、黒い四角の周りに四角形を描きます。私が彼の答えを理解しているように、理論的には、画像が最初にロードされたときに白い選択長方形がブロックされるべきではありませんが、実際にはそうです。
プロジェクトには 2 つの画像が含まれています (1 つは小さい: woodenTile.jpg で、もう 1 つは大きい: bois.jpg)。結果はどちらも同じです。
画像フォーマット
画像が初めて読み込まれるときにUIがブロックされるという問題にこれがどのように関連しているかはよくわかりませんが、PNG画像はUIをブロックせずにデコードされますが、JPG画像はUIをブロックします.
イベントの年表
UIのブロックはここから始まります..
..そしてここで終わります。
AFネットワーキングソリューション
NSURL * url = [ [NSBundle mainBundle]URLForResource:@"bois" withExtension:@"jpg"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[self.imageView setImageWithURLRequest:request
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
NSLog(@"success: %@", NSStringFromCGSize([image size]));
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"failure: %@", response);
}];
// this code works. Used to test that url is valid. But it's blocking the UI as expected.
if (false)
if (url) {
[self.imageView setImage: [UIImage imageWithData:[NSData dataWithContentsOfURL:url]]]; }
ほとんどの場合、次のログが記録されます。success: {512, 512}
また、時折ログに記録します。success: {0, 0}
そして時折:failure: <NSURLResponse: 0x146c0000> { URL: file:///var/mobile/Appl...
しかし、そのイメージは決して変わりません。