2014-01-23 5 views
0

Я использую AVCaptureSession для захвата изображения, а затем отправки его на свой сервер.setNeedsDisplay on uiimageview не обновляет представление сразу

[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) { 

     if (imageSampleBuffer != NULL) { 
      NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
      self.videoImageData = [imageData copy]; 
      [self processImage:[UIImage imageWithData:imageData]]; 

      NSString* response=[self uploadImage]; 
      [activityIndicator removeFromSuperview]; 
      self.takePictureBtn.enabled = YES; 
      [self setUserMessage:response]; 
     } 
    }]; 

- (void) processImage:(UIImage *)image 
{ 
... 

    [UIView beginAnimations:@"rotate" context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    int degrees = [self rotationDegrees]; 
    CGFloat radians =degrees * M_PI/180.0; 
    self.captureImageView.transform = CGAffineTransformMakeRotation(radians); 
    [UIView commitAnimations]; 
    [self.captureImageView setNeedsDisplay]; 
} 

- (NSString*)uploadImage отправить фотографию на сервер

Поведение Я ожидаю, что после processImage заканчивается, что изображение будет отображаться в UIImageView captureImageView на нем вращается индикатор активности, но вместо этого я получаю белый blanc с индикатором вращения и только после завершения запроса на сервер captureImageView отображает изображение

Как я могу достичь желаемого поведения?

Другая проблема я столкнулся в том, что мой imageSampleBuffer возвращает зеркальное отражение принятого одного (объекта слева отображается справа)

ответ

4

Из документов:

This method makes a note of the request and returns immediately. The view is not actually redrawn until the next drawing cycle, at which point all invalidated views are updated.

Поскольку вы делаете другие вещи после того, как вы звоните setNeedsDisplay, событие не заканчивается, и вы не получаете дисплей сразу.

Если вы хотите сделать больше вещей, один подход будет планировать остальную часть материала в новом блоке, как, с

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    NSString *const response = [self uploadImage]; 
    [activityIndicator removeFromSuperview]; 
    self.takePictureBtn.enabled = YES; 
    [self setUserMessage:response]; 
}]; 
+0

что мне нужно сделать, чтобы изменить addBlockWithOperation с причиной я получаю ошибка: неизвестный метод экземпляра для selector 'addBlockWithOperation:'? newbie in distress :( –

+0

Вам нужно переместить код после вызова метода -processImage до конца события, так что на экране появится возможность запуска. Я получил неправильное имя метода, но теперь мой ответ исправлен. сделайте это непосредственно с dispatch_async(). –

Смежные вопросы