2014-09-09 9 views
10

मैंने कोशिश की है लेकिन मुझे बस यह नहीं मिला है। मैं प्रोग्रामिंग के लिए नया हूं इसलिए लगभग हर नया कदम एक प्रयोग है। जबकि मुझे तर्क/रिटर्न के बिना सामान्य बंद करने में कोई समस्या नहीं है, मुझे अब तक समझ में नहीं आया है कि उन कार्यों से निपटने के लिए कैसे करें (एकाधिक) तर्क और अंत में वापस आते हैं।मैं स्विफ्ट में सही तरीके से फ़ंक्शंस कैसे भेजूं?

उचित "काम के आसपास" तर्क का तर्क पाने के लिए यह बहुत अच्छा होगा अगर कोई व्यावहारिक उदाहरण पोस्ट कर सके तो मैं देख सकता था कि मुझे यह सब ठीक है या नहीं। मैं किसी भी तरह की मदद के लिए बहुत आभारी हूं ... अगर कुछ अन्य व्यावहारिक उदाहरण इस विषय को बेहतर तरीके से चित्रित करते हैं, तो कृपया अपने आप से आगे बढ़ें!

मान लें कि हम कम प्राथमिकता वाले पृष्ठभूमि कतार में निम्न फ़ंक्शन को अतुल्यकालिक रूप से प्रेषित करना चाहते हैं (या क्या मैं गलती करता हूं, जब तक फ़ंक्शन को परिभाषित करने की बजाय फ़ंक्शन को परिभाषित करने की कोशिश करता हूं, तब तक इसे किसी और जगह से बुलाया जाता है ?!):

func mutateInt(someInt: Int) -> Int { 
    "someHeavyCalculations" 
    return result 
} 

या कि इसके अलावा में (पृष्ठभूमि कतार में सब कुछ) कुछ बिंदु पर पहले फ़ंक्शन को कॉल करने के लिए कई तर्क के साथ एक समारोह:

func someBadExample(someString: String, anotherInt: Int) -> Int { 
    "someHeavyStuff" 
    println(testString) 
    mutateInt(testInt) 
    return result 
} 

या एक यूआई-समारोह है कि सुनिश्चित किया जाना चाहिए मुख्य कतार पर चलाने के लिए (जे उस्त एक काल्पनिक उदाहरण):

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {   
    let sectionInfo = self.fetchedResultsController.sections?[section] as NSFetchedResultsSectionInfo  
    return sectionInfo.numberOfObjects 
} 
+0

वहाँ 'dispatch_async_f' में उपयोग करने के लिए कारण नहीं है स्विफ्ट, यह केवल सी फ़ंक्शन के लिए मौजूद है जिसमें ब्लॉक समर्थन नहीं है –

+0

ओह वाह, ठीक है, मैं पूरी तरह गलत हूं! तो मुझे समझ में नहीं आया है कि ** उन पैरामीटर को प्रेषित करने के लिए ** ** पैरामीटर (ओं) और वापसी (ओं) या अन्य शब्दों में, तार्किक तरीके (आसपास काम) वास्तव में केवल ब्लॉक का सामना करने के लिए, कार्यों में नहीं, उस उदाहरण में भी - क्या आप इसे उन (थोड़ा संपादित) संस्करणों के साथ अभ्यास में डाल सकते हैं? –

+0

वैसे भी, आपके इनपुट का सम्मान करते हुए मैंने अब पूरी तरह से अपना प्रश्न संपादित कर लिया है, धन्यवाद! –

उत्तर

20

मान लीजिए कि आप था तो जैसे कुछ समारोह दो:

func calculate(foo: String, bar: Int) -> Int { 
    // slow calculations performed here 

    return result 
} 

आपको लगता है कि ऐसा करने के लिए एसिंक्रोनस रूप से करना चाहता था, तो आप इस तरह कुछ में लपेट कर सकते हैं:

func calculate(foo: String, bar: Int, completionHandler: @escaping (Int) -> Void) { 
    DispatchQueue.global().async { 
     // slow calculations performed here 

     completionHandler(result) 
    } 
} 

या, वैकल्पिक रूप से, यदि आप यह सुनिश्चित करना चाहते हैं कि पूरा करने वाले हैंडलर को हमेशा मुख्य कतार पर बुलाया जाता है, तो आप यह भी आपके लिए कर सकते हैं:

func calculate(foo: String, bar: Int, completionHandler: @escaping (Int) -> Void) { 
    DispatchQueue.global().async { 
     // slow calculations performed here 

     DispatchQueue.main.async {   
      completionHandler(result) 
     } 
    } 
} 

पृष्ठभूमि में किए जा रहे कार्यों के लिए, आप एक अलग प्राथमिकता पृष्ठभूमि कतार का उपयोग कर सकते हैं, या आपकी अपनी कस्टम कतार या अपनी स्वयं की ऑपरेशन कतार का उपयोग कर सकते हैं। लेकिन वे विवरण हाथ में सवाल के लिए वास्तव में सामग्री नहीं हैं।

प्रासंगिक क्या है कि यह कार्य, अंतर्निहित सिंक्रोनस फ़ंक्शन के बावजूद कोई भी मूल्य वापस नहीं करता है। इसके बजाए, यह एसिंक्रोनस प्रस्तुति completionHandler बंद होने के माध्यम से मूल्य को वापस पास कर रही है। इस प्रकार, आप यह बहुत तरह का प्रयोग करेंगे:

calculate(foo: "life", bar: 42) { result in 
    // we can use the `result` here (e.g. update model or UI accordingly) 

    print("the result is = \(result)") 
} 

// but don't try to use `result` here, because we get here immediately, before 
// the above slow, asynchronous process is done 

(FYI करें, ऊपर के उदाहरण के सभी स्विफ्ट 3. स्विफ्ट 2.3 गायन के लिए, previous version of this answer देख रहे हैं।)

+1

हालांकि मुझे कुछ दिनों पहले आपके उत्तर के लिए "completHandler" की मूल अवधारणा को समझ लिया गया है, लेकिन मुझे अभी तक एहसास नहीं हुआ है कि इन परिस्थितियों के लिए, एक लपेटा हुआ फ़ंक्शन के साथ संयुक्त रूप से इसका उपयोग किया जा सकता है, बढ़िया! –

संबंधित मुद्दे