2015-02-26 3 views
6

Я создаю приложение iOS с помощью быстрого доступа.Операция вызова в блоке завершения без утечки памяти

Предположим, я хочу отсортировать массив в другом потоке, который является основным потоком. Я могу подкласс NSOperation так:

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

} 

В моей ViewController, я могу использовать что-то вроде:

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

Мой вопрос: так как если я позвоню operation.array в operation.completionBlock, операция никогда не будет Как я могу получить отсортированный массив в блоке завершения (или в другом месте)?

Я вижу путь. Это создать объект с только как свойство array и передать этот объект в Operation, тогда я смогу получить массив внутри объекта, но, несомненно, он существует лучше.

Спасибо

ответ

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

Есть несколько способов, которые могли бы справиться с этим. Вот один из них:

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

Это прерывает цикл удержания в конце блока завершения.

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