我有一个带有 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 中添加两个实例,并实现其 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 之一。
当您从加载图像的视图开始几乎同时点击两个视图时,究竟会发生什么?UI 是否因为等待[self setImage:[UIImage imageNamed:@"woodenTile.jpg"]];
返回而被阻止?如果是这样,我该如何异步执行此操作?
这是 github上的一个项目,带有ipmcc代码
使用长按然后拖动以在黑色方块周围绘制一个矩形。据我了解他的回答,理论上白色选择矩形不应该在第一次加载图像时被阻止,但实际上是这样。
项目中包含两张图片(一张小的:woodenTile.jpg,一张大的: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...
但图像从未改变。