0

次のように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ブロックが完了するまで待機し(最初の画像が画面に配置されます)、次に2番目の画像が表示され、3番目の画像が表示されるようにするため、使用しています。そして、すべてが現在メインスレッドで起こっています。

ただし、途中でデッドロックが発生しているようで、ロジックがいくつかの点で間違っています。

この状況を理解するには助けが必要です。助けてください。

4

3 に答える 3

6

のドキュメントからdispatch_sync:

この関数を呼び出して現在のキューをターゲットにすると、デッドロックが発生します。


とはいえ、設計上の問題があり、GCD を使用しなくても目的の結果を達成できると思います。

UI をk秒ごとに更新したいように見えるので、使用を避け、 を使用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];
}
于 2013-09-08T23:21:49.013 に答える