2015-06-26 2 views
2

В моем проекте я бегу операцию на фоне потока с помощью NSBlockOperation:запустить блок на основной поток сразу после NSBlockOperation на фоне резьбы

var operationQueue = NSOperationQueue() 
var iop = NSBlockOperation(block: { self.reloadSize() /*calculation...*/ }) 
operationQueue.addOperation(iop) 

Сразу после вычисления в фоновом потоке завершены, мне нужно звоните: table.reloadData() на NSTableView. Однако я бы сделал это в том же потоке, из-за проблем с автоматической компоновкой таблица должна быть перезагружена в основном потоке. Как я могу выполнить эту асинхронную взаимосвязь между обоими потоками?

ответ

6

два возможных подхода:

  1. Отправка перезагрузку таблицы внутри блока:

    let operationQueue = NSOperationQueue() 
    let operation = NSBlockOperation() { 
        self.reloadSize() 
        ... 
        dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock() 
         self.table.reloadData() 
        } 
    } 
    operationQueue.addOperation(operation) 
    

    или просто использовать addOperationWithBlock:

    let operationQueue = NSOperationQueue() 
    operationQueue.addOperationWithBlock() { 
        self.reloadSize() 
        ... 
        dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock() 
         self.table.reloadData() 
        } 
    } 
    
  2. Создать новую операцию в зависимости от этого:

    let operationQueue = NSOperationQueue() 
    
    let operation = NSBlockOperation() { 
        self.reloadSize() 
        ... 
    } 
    
    let completionOperation = NSBlockOperation() { 
        self.table.reloadData() 
    } 
    
    completionOperation.addDependency(operation) 
    
    operationQueue.addOperation(operation) 
    NSOperationQueue.mainQueue().addOperation(completionOperation) 
    

Лично я в основном склоняюсь к первому подходу, при том, что последний подход может быть полезен в более сложных сценариях (например, операция завершения зависит от ряда других операций).

+0

идеальный! Спасибо за предоставление альтернативных вариантов. –

0

Попробуйте вызвать CFRunLoopRun(). Он должен работать в текущей очереди.

Если операция работала на основной очереди, текущая очередь будет основной очереди и операция будет работать на нем успешно