2015-02-26 11 views
6

Ich erstelle eine iOS-App mit swift.Aufrufoperation im Abschlussblock ohne Speicherleck

Nehmen wir an, ich möchte ein Array in einem anderen Thread als der Haupt-Thread. Ich NSOperation wie die Unterklasse kann:

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 
       } 
      } 
     } 
    } 

} 

In meinem Viewcontroller, ich so etwas wie verwenden:

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") 
     } 
    } 
} 

Meine Frage ist: denn wenn ich operation.array in operation.completionBlock nennen, den Betrieb wird nie freigegeben werden, Wie kann ich das sortierte Array im Completion-Block (oder anderswo) abrufen?

Ich kann einen Weg sehen. Es ist ein Objekt mit nur dem Array als Eigenschaft zu erstellen und dieses Objekt an Operation übergeben, dann kann ich das Array innerhalb des Objekts abrufen, aber es gibt einen besseren Weg.

Danke

Antwort

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

Es gibt mehrere Möglichkeiten, wie Sie damit umgehen können. Hier ist eine:

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

Dies bricht den Retain-Zyklus am Ende des Abschlussblocks.

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)") 
    } 
}