графический интерфейс iPad обновляется только после касания - PullRequest
2 голосов
/ 08 ноября 2011

Я создаю многопоточное приложение для iPad.У меня есть этот класс, который извлекает кадры из фрагмента ролика, и у меня есть UIScrollView, чтобы показать вещи, которые я извлек.Средство извлечения кадров работает в другом потоке, и я хочу начать сборку прокрутки только после того, как извлеку определенное количество кадров.Поэтому я создал это свойство BOOL, называемое буферизацией, которое я обновляю через поток.Мой контроллер вида наблюдает это свойство и только после того, как это свойство равно NO, я начинаю строить ScrollView.

Проблема в том, что я не вижу никаких изменений в графическом интерфейсе после вызова метода построения.Я вижу вид прокрутки только после касания экрана

Вот что я делаю:

Чтобы создать тему:

[NSThread detachNewThreadSelector:@selector(startReading) toTarget:self withObject:nil];

* 1011код, запущенный в потоке:
-(void) startReadingWithTimeRange:(STimeRange *) timeRange;
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Top-level pool
    //setting the time range for reading the file
    [assetReader setTimeRange:timeRange.timeRange];

    //start reading
    [assetReader startReading];

    //declearing about the buffer
    CMSampleBufferRef buffer;
    int z = 0;
    while ( [assetReader status]==AVAssetReaderStatusReading)
    {
        z++;
        //reading buffer
        buffer = [assetReaderTrackOutput copyNextSampleBuffer];

        if (buffer == NULL) break;
        //converting the buffer to UIImage
        UIImage *frameImage = imageFromSampleBuffer(buffer);
        CMTime time = CMSampleBufferGetOutputPresentationTimeStamp(buffer);
        NSLog(@"###duration %lld",time.value/time.timescale);


        SFrame *frame = [[SFrame alloc] initWithImage:frameImage andTime:time];
        //add it to the frame array
        [framesArray addObject:frame];

        [frame release];
        //check if buffer is not null and needed release


        //release the buffer
        CFRelease(buffer);


        if ([framesArray count] > 100 && self.buffering) {
            [self willChangeValueForKey:@"buffering"];
            self.buffering = NO;
            [self didChangeValueForKey:@"buffering"];

        }


    }
    [pool release];

}

Я действительно не знаю, я очень признателен за любую помощь

1 Ответ

1 голос
/ 29 февраля 2012

Во-первых, не вызывайте willChangeValueForKey и didChangeValueForKey, поскольку вы только дважды запускаете уведомление KVO, оно уже вызывается self.buffering = NO;

Во-вторых, изменения свойства / ivar вне основного потока должны выполняться внутри блока @synchronized, например ::100100

@synchronized (self) {
     self.buffering = NO;
}

Вы можете поочередно использовать executeSelectorOnMainThread для вызова метода буферизации, например ::100100

[self performSelectorOnMainThread:@selector(buffering:) withObject:[NSNumber numberWithBool:YES] waitUntilDone:NO];

Если это не решит вашу проблему, возможно, в вашем коде есть другая проблема, например, необходимо вызвать setNeedsDisplay для некоторого представления или вида.

Вы не сказали, что происходит с уведомлением KVO, вы не получили его, поэтому вы явно пытались отправить его?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...