在主线程外创建 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的主要内容,如果未能解决你的问题,请参考以下文章

我可以在主线程(UI 线程)之外创建 UI 吗?

将 NSManagedObject(在主上下文中创建)从后台线程传递到主线程是不是安全?

UIImage initWithData:从异步调度中阻塞 UI 线程?

检测主线程外的 UI 操作

ThreadedCoreData 示例(来自 Apple)是不是在主线程上创建 NSManagedObjectContext?

从 UIView 制作 UIImage 但不在主线程中