2015-02-26 7 views
6

मैं स्विफ्ट का उपयोग कर एक आईओएस ऐप बना रहा हूं।स्मृति रिसाव के बिना समापन ब्लॉक में कॉल ऑपरेशन

मान लें कि मैं एक सरणी को एक अलग थ्रेड में मुख्य थ्रेड में सॉर्ट करना चाहता हूं। मुझे लगता है कि जैसे 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.completionBlock में operation.array फोन, आपरेशन कभी नहीं होगा जारी किया जा सकता है, मैं समापन ब्लॉक (या अन्यत्र) में क्रमबद्ध सरणी कैसे प्राप्त कर सकता हूं?

मैं एक रास्ता देख सकता हूं। यह केवल ऑब्जेक्ट के रूप में सरणी के साथ ऑब्जेक्ट बनाना है और इस ऑब्जेक्ट को ऑपरेशन में पास करना है, फिर मैं ऑब्जेक्ट के भीतर सरणी को पुनर्प्राप्त करने में सक्षम हूं लेकिन निश्चित रूप से यह एक बेहतर तरीका मौजूद है।

धन्यवाद

उत्तर

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)") 
    } 
} 
संबंधित मुद्दे