在主线程外创建 UIImage
Posted
技术标签:
【中文标题】在主线程外创建 UIImage【英文标题】:Creating a UIImage outside the main thread 【发布时间】:2012-10-16 19:46:55 【问题描述】:我正在使用下面的代码在后台线程中创建 UIImage,然后将此图像设置为我在主线程上的视图图像。偶尔,我会遇到一个糟糕的访问错误。我想知道我是否不应该在后台线程中创建 UIImage 。有什么想法吗?
CGImageRef imageRef =
CGImageCreate(serverInit.rfbWidth,serverInit.rfbHeight,bitsPerComponent,bitsPerPixel,bytesPerRow,colorSpaceRef,bitmapInfo,provider,NULL,NO,renderingIntent);
screenImage = [UIImage imageWithCGImage:imageRef];
CFRelease(imageRef);
[view performSelector:@selector(replaceImage:) onThread:[NSThread mainThread] withObject:screenImage waitUntilDone:NO];
【问题讨论】:
如果不执行选择器replaceImage,它会崩溃吗?我认为您的 screenImage 在选择器在其他线程上执行之前发布。 我没有在没有选择器的情况下尝试过 - 这个错误很少发生,如果没有这个选择器,我无法真正长时间测试应用程序。至于发布,我认为我可以在使用 imageref 创建 UIImage 后立即执行此操作。不是这样吗? 如果很少,那么 screenImage 会在 replaceImage 选择器之前释放 【参考方案1】:试试这个,它会阻止screenImage被释放
CGImageRef imageRef = CGImageCreate(serverInit.rfbWidth,serverInit.rfbHeight,bitsPerComponent,bitsPerPixel,bytesPerRow,colorSpaceRef,bitmapInfo,provider,NULL,NO,renderingIntent);
screenImage = [UIImage imageWithCGImage:imageRef];
CFRelease(imageRef);
dispatch_sync(dispatch_get_main_queue(), ^
[view replaceImage:screenImage];
);
【讨论】:
谢谢我已经相应地更改了我的代码 - 将在接下来的几天内观察,如果我没有再次遇到崩溃,会将其标记为正确答案。不过要重申我最初的问题,是否可以使用以下行:screenImage = [UIImage imageWithCGImage:imageRef];在后台线程中? 为什么不呢?你在其他地方用过吗?以上是关于在主线程外创建 UIImage的主要内容,如果未能解决你的问题,请参考以下文章
将 NSManagedObject(在主上下文中创建)从后台线程传递到主线程是不是安全?
UIImage initWithData:从异步调度中阻塞 UI 线程?
ThreadedCoreData 示例(来自 Apple)是不是在主线程上创建 NSManagedObjectContext?