这是什么意思?
我实际上是试图在后台线程上运行我的过滤器,所以我可以在主线程上运行HUD(见下文).这在coreImage的上下文中是否有意义?我认为核心图像固有地使用GCD.
//start HUD code here,on main thread // Get a concurrent queue form the system dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_async(concurrentQueue,^{ //Effect image using Core Image filter chain on a background thread dispatch_async(dispatch_get_main_queue(),^{ //dismiss HUD and add fitered image to imageView in main thread }); });
更多来自Apple Docs:
Maintaining Thread Safety
CIContext and CIImage objects are immutable,
which means each can be shared safely among threads. Multiple threads
can use the same GPU or cpu CIContext object to render CIImage
objects. However,this is not the case for CIFilter objects,which are
mutable. A CIFilter object cannot be shared safely among threads. If
your app is multithreaded,each thread must create its own CIFilter
objects. Otherwise,your app could behave unexpectedly.
解决方法
//start HUD code here,on main thread // Assuming you already have a CIFilter* variable,created on the main thread,called `myFilter` CIFilter* filterForThread = [myFilter copy]; // Get a concurrent queue form the system dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,^{ CIFilter filter = filterForThread; // Effect image using Core Image filter chain on a background thread dispatch_async(dispatch_get_main_queue(),^{ //dismiss HUD and add fitered image to imageView in main thread }); }); [filterForThread release];
这里发生的是filterForThread是myFilter的副本.在传递给dispatch_async的块中引用filterForThread将导致该块保留filterForThread,然后调用范围释放filterForThread,这有效地完成了filterForThread对块的概念所有权的转移(因为块是唯一留下引用的块)它). filterForThread可以被认为是执行块的线程的私有.
这应该足以满足此处的线程安全要求.