从后台线程调用时延迟IPad

时间:2013-04-14 18:34:44

标签: ios objective-c ipad

我正在将我的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];
    });
});

}

1 个答案:

答案 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];

现在你只需要回到主线程一次。图像处理时会有延迟,但接口应该只是更新,坏技术编程术语(技术编程术语)。