Я использую NSView с поддержкой CATiledLayer (Mac, а не iOS) и согласно документам Apple https://developer.apple.com/reference/quartzcore/catiledlayer Я ожидаю, что это будет вызываться асинхронно, в нескольких потоках для повышения производительности, однако кажется, что это когда-либо вызывается только в основном потоке.
Я делаю работу в drawLayer(layer: CALayer, inContext ctx: CGContext)
Я включил canDrawConcurrently
в NSView, а также удостоверился, что для окна установлено значение allowsConcurrentViewDrawing
как true (по умолчанию), но оно по-прежнему всегда вызывает основной поток для каждого прямоугольника плитки.
Мне нужно выполнить некоторые манипуляции с изображением перед отображением в зависимости от области прямоугольника, требующей отображения, и работа в основном потоке влияет на производительность.
Любые идеи, как я могу заставить его вызывать фоновый поток?
Я попытался упорядочить изображение в фоновом потоке, а затем вызвать основную очередь со следующим, но он отображает пустой прямоугольник:
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)
})
}
})