我正在将我的iPhone应用转换为iPad,我遇到了转换问题。我有一个后台线程,可以创建一些缩略图。
问题似乎是应用程序循环通过数组并输出所有项目,但只有最后一项似乎加载了UIButton文本。在所有前面的按钮显示文本之前有5-15秒的延迟。
UIImage *tmp = [self thumbnailImage:[effect objectAtIndex:0] thumbnailType:@"category"];
for (id effect in effectArray) {
UIImage *tmp = [self thumbnailImage:[effect objectAtIndex:0] thumbnailType:@"category"];
dispatch_async(dispatch_get_main_queue(), ^{
UIView *effectView = [[UIView alloc] initWithFrame:CGRectMake(item_x_axis, current_row_height, item_width, item_height)];
UIImageView *imagepreview = [[UIImageView alloc] init];
[imagepreview setFrame:CGRectMake(20, 20, 100, 100)];
[imagepreview setImage:tmp];
imagepreview.contentMode = UIViewContentModeScaleAspectFit;
imagepreview.layer.shadowColor = [UIColor blackColor].CGColor;
imagepreview.layer.shadowOffset = CGSizeMake(0, 1);
imagepreview.layer.shadowOpacity = 1;
imagepreview.layer.shadowRadius = 2.0;
imagepreview.clipsToBounds = NO;
[effectView addSubview:imagepreview];
if([[effect objectAtIndex:3] isEqualToString:@"iap"]){
UIImageView *buttonPlus = [[UIImageView alloc] init];
[buttonPlus setFrame:CGRectMake(54, 66, 23, 23)];
[buttonPlus setImage:[UIImage imageNamed:@"ButtonPlus.png"]];
[effectView addSubview:buttonPlus];
}
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:NSSelectorFromString([effect objectAtIndex:1]) forControlEvents:UIControlEventTouchDown];
[button setTitle:[effect objectAtIndex:2] forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, item_width, item_height);
button.titleLabel.font = [UIFont systemFontOfSize:11];
[button setTitleShadowColor:[UIColor blackColor] forState:UIControlStateNormal];
[button.titleLabel setShadowOffset:CGSizeMake(1.0f, 1.0f)];
[button setTitleEdgeInsets:UIEdgeInsetsMake(120, 0, 0.0, 0.0)];
[effectView addSubview:button];
[self.viewScrollCategories addSubview:effectView];
button = nil;
});
if(current_items_per_row < 3){
current_items_per_row++;
item_x_axis = item_x_axis + item_width;
}else {
current_row_height = current_row_height + item_height;
current_items_per_row = 1;
item_x_axis = 0;
}
}
知道如何解决这个问题吗?它似乎在iPhone上工作正常。
编辑
这是调用后台线程(缩短)的代码
- (void)imagePickerController:( UIImagePickerController *)picker didFinishPickingMediaWithInfo: (NSDictionary *)info {
//[self generatingThumbnailMessageShow];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self loadAllEffects];
dispatch_async(dispatch_get_main_queue(), ^{
[self generatingThumbnailMessageHide];
});
});
}
答案 0 :(得分:2)
嗯,您要求延迟dispatch_async(dispatch_get_main_queue()...
。该代码的意思是“请在有时间的情况下执行此操作,在我当前代码完成运行后的某个时间。”一旦你这么说,你基本上说这个代码运行时你不在乎。你希望它很快就会有一段时间,但是你已经离开了运行时来处理细节。
也许正是这个“希望”才是问题所在。设备处理器的体系结构是不同的,设备的线程模型可能会改变设备响应这些延迟请求堆积的方式。
我对你在这段代码中想要完成的事情一点都不清楚(对不起,tl:dr
)但是在其中间使用了延迟的表现以及你的投诉是否存在“5 -15秒延迟“似乎以某种方式结合在一起......
编辑:好的,我现在看到您的代码在后台运行,并且您正在使用dispatch_async
跳出到主线程以修改接口。所以问题可能是你引用的代码中的不是,而是在你用来管理背景线程的代码中。
另一个编辑:这里只是一个狂野而疯狂的想法。如果需要时间的是图像处理,为什么不进行 all 图像处理,然后在主线程上进行一次的界面更新?我的意思是,你这样做:
for (id effect in effectArray) {
UIImage *tmp = // ...
dispatch_async(dispatch_get_main_queue(), ^{
// ...
[imagepreview setImage:tmp];
因此,每次循环都会重复返回主线程。为什么不试试这个:
dispatch_async(dispatch_get_main_queue(), ^{
for (id effect in effectArray) {
UIImage *tmp = // ...
// ...
[imagepreview setImage:tmp];
现在你只需要回到主线程一次。图像处理时会有延迟,但接口应该只是更新,坏技术编程术语(技术编程术语)。