2015-02-26 8 views
6

Tworzę aplikację na iOS za pomocą Swift.Operacja wywołania w bloku zakończenia bez wycieku pamięci

Załóżmy, że chcę posortować tablicę w innym wątku niż wątek główny. Mogę podklasy NSOperation tak:

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

} 

W moim ViewController, mogę użyć czegoś takiego:

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

Moje pytanie brzmi: ponieważ jeśli zadzwonię operation.array w operation.completionBlock, operacja nigdy zostać zwolniony, Jak mogę odzyskać posortowaną tablicę w bloku zakończenia (lub gdzie indziej)?

Widzę sposób. Jest to stworzenie obiektu z samą tablicą jako własnością i przekazanie tego obiektu do Operacji, wtedy będę mógł pobrać tablicę wewnątrz obiektu, ale na pewno istnieje lepszy sposób.

Dziękuję

Odpowiedz

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

Istnieje kilka sposobów, można sobie z tym poradzić. Oto jeden:

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

Powoduje to przerwanie cyklu zatrzymania na końcu bloku zakończenia.

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)") 
    } 
} 
Powiązane problemy