귀하의 특정 요구 사항에 따라 확실하게 말할 수는 없지만 (귀하의 특정 요구 사항에 귀하의 질문에서 메인 스레드 의존성이 표시되지 않을 수 있기 때문에) 특히 여기서 논란이되는 내용은 없습니다. 예를 들어, 다음 코드는 문제없이 잘 작동 : 여기
CGImageRef CreateImageFromView(NSView* view)
{
const CGSize contextSize = CGSizeMake(ceil(view.frame.size.width), ceil(view.frame.size.height));
const size_t width = contextSize.width;
const size_t height = contextSize.height;
const size_t bytesPerPixel = 32;
const size_t bitmapBytesPerRow = 64 * ((width * bytesPerPixel + 63)/64); // Alignment
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, bitmapBytesPerRow, colorSpace, kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
[view displayRectIgnoringOpacity: view.bounds inContext: [NSGraphicsContext graphicsContextWithGraphicsPort: context flipped: YES]];
CGImageRef image = CGBitmapContextCreateImage(context);
CGContextRelease(context);
return image;
}
- (IBAction)doStuff:(id)sender
{
static NSUInteger count = 0;
for (NSUInteger i =0; i < 100; ++i)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSButton* button = [[[NSButton alloc] initWithFrame: NSMakeRect(0, 0, 200, 100)] autorelease];
button.title = [NSString stringWithFormat: @"Done Stuff %lu Times", (unsigned long)count++];
CGImageRef image = CreateImageFromView(button);
NSImage* nsImage = [[[NSImage alloc] initWithCGImage:image size: NSMakeSize(CGImageGetWidth(image), CGImageGetHeight(image))] autorelease];
CGImageRelease(image);
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = nsImage;
});
});
}
}
의 핵심은 모든 배경 렌더링 작업에 "개인"이 될 것입니다. 자체보기, 자체 그래픽 컨텍스트 등을 얻습니다. 아무 것도 공유하지 않으면이 작업이 정상적으로 이루어집니다. 귀하가 명시 적으로 말했듯이, "각 요청이 완전히 분리되어 있고 그들 사이에 아무 것도 공유되지 않은 상태에서"귀하는 이미이 조건을 만족 시켰다고 생각합니다.
사용해보기. 문제가 생기면 의견을 남기십시오.
여기에 더 자세한 내용이 필요하다고 생각합니다. NSView를 렌더링한다고합니다. 어떻게 이러는거야? (즉, 수동으로'-drawRect :'를 호출하고 있습니까?)보기에 무엇이 있습니까? – ipmcc
Snow Leopard 이후 백그라운드 스레드 (NSView canDrawConcurrently)에서 동시 드로잉을위한 일반적인 흐름 (즉, 실제로 제공된 UI에 참여하는 NSView)에서 지원이 있습니다. 그게 당신이하고있는 것입니다. 왜냐하면 뷰는 윈도우의 뷰 계층과 관련이 없기 때문입니다. 그러나 다시 ... 우리는 더 자세한 정보가 필요합니다. – ipmcc
예 .. 드로잉은 동시에 발생할 수 있지만 대부분의 API는 '스레드 안전'이 아닙니다. –