UIView анимация задерживается - PullRequest
2 голосов
/ 04 октября 2011

Приложение, которое я разрабатываю, использует пользовательские объявления.Я получаю рекламу нормально, и сетевая сторона работает правильно.У меня проблема в том, что когда AdController получает объявление, он анализирует объект JSON, а затем запрашивает изображение.

// Request the ad information
NSDictionary* resp = [_server request:coords_dict isJSONObject:NO responseType:JSONResponse];
// If there is a response...
if (resp) {
    // Store the ad id into Instance Variable
    _ad_id = [resp objectForKey:@"ad_id"];
    // Get image data
    NSData* img = [NSData dataWithContentsOfURL:[NSURL URLWithString:[resp objectForKey:@"ad_img_url"]]];
    // Make UIImage
    UIImage* ad = [UIImage imageWithData:img];
    // Send ad to delegate method
    [[self delegate]adController:self returnedAd:ad];
}

Все это работает, как и ожидалось, и AdController просто тянет изображение ...

-(void)adController:(id)controller returnedAd:(UIImage *)ad{
    adImage.image = ad;
    [UIView animateWithDuration:0.2 animations:^{
        adImage.frame = CGRectMake(0, 372, 320, 44);
    }];
    NSLog(@"Returned Ad (delegate)");
}

Когда вызывается метод делегата, он записывает сообщение на консоль, но для анимации UIImageView* adImage требуется до 5-6 секунд. Из-за способа обработки приложенияПо запросу объявлений анимация должна быть мгновенной.

Анимация для скрытия рекламы немедленная.

-(void)touchesBegan{
    [UIView animateWithDuration:0.2 animations:^{
        adImage.frame = CGRectMake(0, 417, 320, 44);
    }];
}

1 Ответ

4 голосов
/ 04 октября 2011

Если загрузка рекламы происходит в фоновом потоке (самый простой способ проверить это [NSThread isMainThread]), то вы не можете обновить состояние пользовательского интерфейса в том же потоке! Большая часть UIKit не является потокобезопасной; конечно UIViews в настоящее время отображаться не являются. Вероятно, происходит то, что основной поток не «замечает» изменения, происходящие в фоновом потоке, поэтому он не сбрасывается на экран, пока не произойдет что-то еще.

-(void)someLoadingMethod
{
  ...
  if (resp)
  {
    ...
    [self performSelectorInMainThread:@selector(loadedAd:) withObject:ad waitUntilDone:NO];
  }
}

-(void)loadedAd:(UIImage*)ad
{
  assert([NSThread isMainThread]);
  [[self delegate] adController:self returnedAd:ad];
}
...