У меня есть большое jpeg-изображение, которое я хочу загружать в плит асинхронно в моем движке opengl. Все работает хорошо, если это делается на основной нити, но медленнее.Чтение CGImageRef в фоновом потоке сбой приложения
Когда я пытаюсь поместить загрузку плитки в NSOperationBlock, она всегда сбой при попытке доступа к указателю данных общего изображения, который я ранее загружал в основной поток.
Должно быть что-то, что я не получаю от операции фона, потому что я предполагаю, что могу получить доступ к разделам памяти, которые я создал в основном потоке.
Что я пытаюсь сделать, это следующее:
@interface MyViewer
{
}
@property (atomic, assign) CGImageRef imageRef;
@property (atomic, assign) CGDataProviderRef dataProvider;
@property (atomic, assign) int loadedTextures;
@end
...
- (void) loadAllTiles:(NSData*) imgData
{
queue = [[NSOperationQueue alloc] init];
//Loop for Total Number of Textures
self.dataProvider = CGDataProviderCreateWithData(NULL,[imgData bytes],[imgData length],0);
self.imageRef = CGImageCreateWithJPEGDataProvider(self.dataProvider, NULL, NO, kCGRenderingIntentDefault);
for (int i=0; i<tileCount; i++)
{
// I also tried this but without luck
//CGImageRetain(self.imageRef);
//CGDataProviderRetain(self.dataProvider);
NSBlockOperation *partsLoading = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakpartsLoadingOp = partsLoading;
[partsLoading addExecutionBlock:^{
TamTexture2D& pTex2D = viewer->getTile(i);
CGImageRef subImgRef = CGImageCreateWithImageInRect(self.imageRef, CGRectMake(pTex2D.left, pTex2D.top, pTex2D.width, pTex2D.height));
//!!!Its crashing here!!!
CFDataRef cgSubImgDataRef = CGDataProviderCopyData(CGImageGetDataProvider(subImgRef));
CGImageRelease(subImgRef);
...
}];
//Adding Parts loading on low priority thread. Is it all right ????
[partsLoading setThreadPriority:0.0];
[queue addOperation:partsLoading];
}
Совет: обновление пользовательского интерфейса должно быть сделано в основном цикле выполнения. Вы можете выполнять обработку в фоновом потоке, но принудительно в основном цикле запуска при фактическом обновлении пользовательского интерфейса. –
Да, я действительно абстрагировал эту часть кода в моем примере, thx – AkademiksQc
Является одним из ваших refs NULL? – CodaFi