我正在尝试使用GCD依次放置图像,如下所示

-(void)setUpImages {
    NSArray *images  =   @[[UIImage imageNamed:@"blogger-icon.png"],
                           [UIImage imageNamed:@"gplus-icon.png"],
                            [UIImage imageNamed:@"facebok-icon.png"]
                           ];
    [images enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
          dispatch_sync(dispatch_get_main_queue(), ^{
                UIImageView     *imageView  =   [[UIImageView alloc] initWithFrame:CGRectMake(80, idx * ((UIImage*)obj).size.height + idx*30 + 10, ((UIImage*)obj).size.width, ((UIImage*)obj).size.height)];
                NSLog(@"index is %@",NSStringFromCGRect(imageView.frame));

                [imageView setImage:(UIImage*)obj];
                [self.view.layer addSublayer:imageView.layer];
                sleep(1);
            });
    }];

}


我正在使用dispatch_sync,因为我希望它一直等到它的块完成(将第一张图像放置在屏幕上),然后再显示第二张图像,因此第三张也是如此。现在,所有事情都在主线程上发生。

但是,似乎我在中间陷入僵局,在某些时候我的逻辑是错误的。

我需要帮助来了解这种情况。请帮忙。

最佳答案

dispatch_sync的文档中:


  调用此函数并以当前队列为目标会导致死锁。




就是说,我认为您有一个设计问题,并且可以在不涉及GCD的情况下实现所需的结果。

因为看起来您想每隔K秒更新一次UI,所以避免使用sleep(1)并使用performSelector:withObject:afterDelay:延迟地递归调用方法。

就像是

- (void)updateImageViewWithImageAtIndex:(NSNumber *)i {
    UIImage * image = self.images[i.intValue];
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, idx * image.size.height + idx*30 + 10, image.size.width, image.size.height)];
    NSLog(@"index is %@",NSStringFromCGRect(imageView.frame));
    [imageView setImage:image];
    [self.view.layer addSublayer:imageView.layer];

    if (i < images.count - 1) {
        [self performSelector:@selector(updateImageViewWithImageAtIndex:) withObject:@(i.intValue++) afterDelay:1];
    }
}

- (void)setUpImages {
    // Assuming you have declared images as a property
    self.images = @[[UIImage imageNamed:@"blogger-icon.png"],
                        [UIImage imageNamed:@"gplus-icon.png"],
                        [UIImage imageNamed:@"facebok-icon.png"]
                       ];
    [self updateImageViewFromImages:images index:0];
}

07-26 08:56