2015-02-26 12 views
6

Sto creando un'app per iOS utilizzando swift.Operazione di chiamata nel blocco di completamento senza perdita di memoria

Diciamo che voglio ordinare una matrice in un thread diverso che il thread principale. Posso sottoclasse NSOperation così:

import UIKit 

class Operation: NSOperation { 

    var array:[Int] 

    init(array:[Int]){ 
     self.array=array 
     println("Operation init") 
    } 

    deinit{ 
     println("Operation deinit") 
    } 

    override func main() { 
     for i in 0..<array.count{ 
      for j in 0..<array.count{ 
       if array[i]<array[j]{ 
        let k = array[i] 
        array[i] = array[j] 
        array[j] = k 
       } 
      } 
     } 
    } 

} 

Nel mio ViewController, posso usare qualcosa come:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let array = [6,5,4,3,2,1] 
     let operation = Operation(array: array) 
     let operationQueue = NSOperationQueue() 
     operationQueue.addOperation(operation) 
     operation.completionBlock = { 
      println("done") 
     } 
    } 
} 

La mia domanda è: perché se chiamo operation.array in operation.completionBlock, operazione non sarà mai essere rilasciato, come posso recuperare l'array ordinato nel blocco di completamento (o altrove)?

Posso vedere un modo. È per creare un oggetto con la sola matrice come proprietà e passare questo oggetto a Operazione, quindi sarò in grado di recuperare la matrice all'interno dell'oggetto ma sicuramente esiste un modo migliore.

Grazie

risposta

7
operation.completionBlock = { [unowned operation] in 
    operation.array // use your array 
} 
2

Ci sono diversi modi si può gestire questa situazione. Eccone uno:

operation.completionBlock = { 
    println("done") 
    // other stuff involving operation.array 
    operation.completionBlock = nil 
} 

Interrompe il ciclo di mantenimento alla fine del blocco di completamento.

0

operation.array

func testSortArray() { 
    let array = [6,5,4,3,2,1] 
    let operation = Operation(array: array) 
    let operationQueue = NSOperationQueue() 
    operationQueue.addOperation(operation) 
    operation.completionBlock = { 
     println("done \(operation.array)") 
    } 
}