Md1*_*079 5 grand-central-dispatch ios
我有一个视频解码器使用AVSampleBufferDisplayLayer播放H264,所有工作都很好,直到我在同一个视图控制器上滚动UICollectionViewController.这似乎阻止导致应用程序崩溃的主线程.我已尝试使用dispatch_async将此代码放在一个单独的队列中的块中,但仍然具有相同的阻塞问题以及解码器上的其他性能问题.
dispatch_async(sampleQueue, ^{
[sampleBufferQueue addObject:(__bridge id)(sampleBuffer)];
if ([avLayer isReadyForMoreMediaData]) {
CMSampleBufferRef buffer = (__bridge CMSampleBufferRef)([sampleBufferQueue objectAtIndex:0]);
[sampleBufferQueue removeObjectAtIndex:0];
[avLayer enqueueSampleBuffer:buffer];
buffer = NULL;
NSLog(@"I Frame");
[avLayer setNeedsDisplay];
while ([sampleBufferQueue count] > 0 && [avLayer isReadyForMoreMediaData]) {
CMSampleBufferRef buffer = (__bridge CMSampleBufferRef)([sampleBufferQueue objectAtIndex:0]);
[sampleBufferQueue removeObjectAtIndex:0];
[avLayer enqueueSampleBuffer:buffer];
buffer = NULL;
NSLog(@"I Frame from buffer");
[avLayer setNeedsDisplay];
}
}
else {
NSLog(@"AVlayer Not Accepting Data (I)");
}
});
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个任务优先于用户界面操作,如滚动集合视图等?抱歉缺乏理解我对IOS来说是个新手.
结果 UICollectionView 阻塞了主线程上 NSURLConnection 的委托调用。这解决了这个问题:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
Run Code Online (Sandbox Code Playgroud)
变成
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[connection start];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
543 次 |
| 最近记录: |