iPad用のマルチスレッドアプリをビルドしています。私はムービークリップからフレームを抽出するこのクラスを持っており、私は抽出したものを表示するためにUIScrollViewを持っています。フレーム抽出プログラムは別のスレッドで実行されており、一定量のフレームを抽出した後にのみスクロールビューの作成を開始します。したがって、スレッドを更新するバッファリングと呼ばれるこのBOOLプロパティを作成しました。私のビューコントローラはこのプロパティを観察し、このプロパティがNOに等しい場合にのみ、ScrollViewの構築を開始します。iPad GUIはタッチ後にのみ更新されます
問題は、ビルドメソッドが呼び出された後にGUIに変更がないことです。
をスレッドを作成するには:
[NSThread detachNewThreadSelector:@selector(startReading) toTarget:self withObject:nil];
スレッドで実行されているコード:
-(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];
}
私は画面をタッチした後、私は何イムやっ
HERESにスクロールビューを見ることができます
私は本当に助けに感謝します。
セレクタがメソッド名と一致しません... – jakev
'startReading'は正しい範囲で' startReadingWithTimeRange: 'のみを呼び出します –
興味深い部分は実際には"スクロールビューを作成する "コードでしょう。私の推測では、あなたはどこかで 'setNeedsDisplay'呼び出しを必要とするでしょう。 – mrueg