Call operation in completion block without memory leak
ios, nsoperation, swift
Solution
operation.completionBlock = { [unowned operation] in
operation.array // use your array
}
Problem
I am creating an iOS app using swift. Let's say I want to sort an array in a different thread that the main thread. I can subclass NSOperation like that : ``` 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 my ViewController, I can use something like : ``` 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") } } } ``` My question is :since if I call operation.array in operation.completionBlock, operation will never be released, How can I retrieve the sorted array in the completion block (or elsewhere)? I can see a way. It's to create an object with just the array as property and pass this object to Operation then I will be able to retrieve the array within the object but for sure it does exist a better way. Thank you