CATiledLayer drawLayer:始终在主线程上调用inContext - MacOS El Capitan

Her*_*rwr 7 macos core-animation calayer nsview catiledlayer

我正在使用CATiledLayer支持的NSView(Mac而不是iOS),根据Apple文档https://developer.apple.com/reference/quartzcore/catiledlayer我希望在多个线程上异步调用它以帮助提高性能,不过它似乎只是在主线程上被调用.

我正在做的工作 drawLayer(layer: CALayer, inContext ctx: CGContext)

我已经canDrawConcurrently在NSView上启用了以及确保窗口allowsConcurrentViewDrawing设置为true(默认),但它仍然总是调用每个tile rect的主线程.

我需要在显示之前进行一些图像处理,这取决于需要显示的矩形区域,并且在主线程上运行会影响性能.

任何想法我怎么能强迫它在后台线程上调用?

我已经尝试将操作编组到后台线程上,然后使用以下内容调用主队列,但它显示一个空白的矩形:

backgroundQueue.addOperationWithBlock({ [ weak self ] in            
    guard let strongSelf = self else { return }

    // ** This is the part I nee to do in background that can take some time
    guard let image = strongSelf.imageForTileRect(layerBounds, imageSize: imageSize) else { return }
    // ** End background bit

    var rect = layerBounds
    let rectImageRef = image.CGImageForProposedRect(&rect, context: nil, hints: nil)

    if (rectImageRef != nil) {
        NSOperationQueue.mainQueue().addOperationWithBlock({ 
            CGContextDrawImage(ctx, rect, rectImageRef)
        })
    }
})
Run Code Online (Sandbox Code Playgroud)

Ste*_*son 0

所以这就是我所做的,虽然并不理想,但确实有效。drawRect:在我的CATiledLayer背景中NSView,我画了一个简单的背景(在我的例子中是一个简单的网格)。我创建了另一个CATiledLayer并将其添加到我的 NSView 层作为子层,并将 NSView 设置为其委托。第二个“CATiledLayer”正在后台线程上获取委托绘制调用。