我正在尝试使用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];
}