2013-09-08 3 views
0

Я пытаюсь поместить изображение один за другим, используя НОД как следующийЯ думаю, что я получаю в тупик, но не совсем понимаю, почему

-(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, потому что я хочу, он будет ждать, пока его блок не будет сделано (первое изображение помещается на экран), тогда будут отображаться и другие изображения. И теперь все происходит в основном потоке.

Однако, похоже, я встаю в тупик посередине, и моя логика в некоторых случаях ошибочна.

Мне нужна помощь, чтобы понять эту ситуацию. Пожалуйста помоги.

+1

«Я использую dispatch_sycn, потому что я хочу, чтобы он подождал, пока его блок не будет выполнен» Также, если вы не используете dispatch_sync, вы ждете, пока не будет выполнен каждый блок, использование GCD здесь не нужно и причина тупика (см. Ответ Петронеллы). –

ответ

2

Теперь я могу быть совершенно неправ, но похоже, что все, что вы пытаетесь сделать, это изменить изображение в режиме просмотра изображения раз в секунду, и в этом случае ваш подход неверен. UIImageView имеет методы для этого встроенного Например:.

NSArray *images = @[[UIImage imageNamed:@"blogger-icon.png"], 
         [UIImage imageNamed:@"gplus-icon.png"], 
         [UIImage imageNamed:@"facebok-icon.png"] 
         ]; 

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, idx * ((UIImage*)obj).size.height + idx*30 + 10, ((UIImage*)obj).size.width, ((UIImage*)obj).size.height)]; 
[imageView setAnimationDuration:3]; 
[imageView setAnimationImages:images]; 
[imageView startAnimating]; 
6

Из документации dispatch_sync:

Вызов этой функции и таргетирование текущих результатов очереди в тупике.


То есть, я думаю, что у вас есть проблемы дизайна и вы можете достичь желаемого результата без привлечения НОД.

Так это выглядит, как вы хотите, чтобы обновить пользовательский интерфейс каждые к секунд, избегать использования 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]; 
} 
+1

Звонок dispatch_sync, использующий основную очередь, наверняка звучит как источник тупика для меня. –

+0

Да, я соглашался с тобой. –

+0

@ DuncanC да простите, я устал, и я неправильно прочитал ваш комментарий. По этой причине я удаляю свою добычу. :) –

0

Я думаю, что Габриэле прибит затор выше. Не вызывайте dispatch_sync и не переходите в основную очередь.

Другая возможная проблема. Я подозреваю, что манипулирование представлениями слоя не является потокобезопасным. Он не должен вызывать тупик, но это может привести к нежелательным последствиям.