首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPad图形用户界面仅在触摸后更新

iPad图形用户界面仅在触摸后更新
EN

Stack Overflow用户
提问于 2011-11-08 06:48:56
回答 1查看 140关注 0票数 2

我正在为iPad构建一个多线程的应用程序。我有一个从电影剪辑中提取帧的类,我有一个UIScrollView来显示我提取的内容。帧提取器在不同的线程中运行,我只想在提取一定数量的帧之后才开始构建滚动视图。因此,我创建了这个名为buffering的BOOL属性,它通过线程进行更新。我的视图控制器观察这个属性,并且只有在这个属性等于没有im开始构建ScrollView之后。

问题是在调用构建方法后,我在GUI中看不到任何变化。我只能在触摸屏幕后看到滚动视图

这就是我要做的:

要创建线程,请执行以下操作:

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

线程中运行的代码:

代码语言:javascript
复制
-(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];

}

我真的一无所知,真的很感谢任何人的帮助

EN

回答 1

Stack Overflow用户

发布于 2012-03-01 00:59:50

首先,不要调用willChangeValueForKey和didChangeValueForKey,因为你只触发了两次KVO通知,它已经被self.buffering =NO触发了;

其次,主线程外部的属性/ivar更改应该在@synchronized块内完成,例如:

代码语言:javascript
复制
@synchronized (self) {
     self.buffering = NO;
}

您也可以使用performSelectorOnMainThread来调用缓冲方法,例如:

代码语言:javascript
复制
[self performSelectorOnMainThread:@selector(buffering:) withObject:[NSNumber numberWithBool:YES] waitUntilDone:NO];

如果这样做不能解决您的问题,那么您的代码中可能存在另一个问题,例如,需要在某个视图或类似的视图上调用setNeedsDisplay。

你没有说KVO通知发生了什么,你没有得到它,这就是为什么你明确地试图发送它?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8043789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档