2016-01-22 11 views
6

पर एक सेग्यू से पहले एक एसिंक्रोनस कॉल बनाना मेरे पास व्यू कंट्रोलर (एम्बेडेड नेविगेशन कंट्रोलर) का एक समूह है, और मुझे अगली स्क्रीन पर सीगू करने से पहले मुझे कुछ एसिंक कॉल करने की आवश्यकता है। समस्या यह है कि जब मैं segue में मैप किए गए बटन पर क्लिक करता हूं, तब मुझे यह कॉल करने की आवश्यकता होती है, लेकिन चूंकि async कॉल अभी तक वापस नहीं आया है, इसलिए segue बनाया गया है और अगला दृश्य नियंत्रक दिखाया गया है। एसिंक कॉल वापस आने से पहले दृश्य नियंत्रक नेविगेशन को रोकने के लिए लोग इस तरह की चीज कैसे करते हैं?अगले दृश्य नियंत्रक (स्विफ्ट)

+1

क्या आपके पास कोई कोड दिखाने के लिए है? – iamalizade

+1

न करें, इसे नए नियंत्रक – Wain

+0

में करें, मैं इसे अगले नियंत्रक में नहीं कर सकता क्योंकि अगला दृश्य नियंत्रक केवल तभी प्रदर्शित किया जाना चाहिए जब एसिंक विधि सफल हो। – u84six

उत्तर

5

टी एल फोन करके वापस मुख्य थ्रेड पर होने की segue की जरूरत है; डॉ आप UIButton के लिए @IBAction बना सकते हैं और फ़ंक्शन के अंदर एसिंक कॉल बनाते हैं और समापन में मैन्युअल रूप से segue लॉन्च करते हैं dispatch_async(dispatch_get_main_queue()) {} का उपयोग करके हैंडलर

निम्न चित्र में की तरह अगले एक करने के लिए UIViewController से अपने segue मैन्युअल सिर्फ Ctrl +खींचें बनाने के लिए:

enter image description here

और फिर आप segue के प्रकार का चयन करने देखेंगे इस तस्वीर में की तरह:

enter image description here

आप Show प्रकार आप को देखने के पदानुक्रम में segue देख सकते हैं अपने बाएँ में चुनने के बाद इस तस्वीर में की तरह segue के लिए पहचानकर्ता सेट करने के लिए यह चुनें: मैन्युअल segue साथ शुरू करने

enter image description here आप आपकी समस्या को संभाल कर सकते हैं फ़ंक्शन performSegueWithIdentifier, इंटरफ़ेस बिल्डर का उपयोग करके मैन्युअल रूप से सीगू बनाने के तरीके के बारे में बहुत सारे ट्यूटोरियल खोजने के लिए आप वेब पर संदर्भित कर सकते हैं।

एक बार जब आप segue बना दिया गया है आप इसे कहीं भी आप चाहते हैं, आपके मामले में कॉल कर सकते हैं के रूप में आप इसे एक completionHandler एक async की अंदर बुला जाएगा फोन आप के dispatch_async(dispatch_get_main_queue()) {} फ़ंक्शन का उपयोग मुख्य थ्रेड में में डाल करने की आवश्यकता है ग्रांड सेंट्रल डिस्पैच।

कुछ इस कोड की तरह:

@IBAction func buttonTapped(sender: AnyObject) { 
    asyncFunction() { 
     dispatch_async(dispatch_get_main_queue()) { 
      self.performSegueWithIdentifier("someID", sender: sender) 
     } 
    } 
} 

संपादित: ध्यान दें कि स्विफ्ट 3 में वाक्य विन्यास बदल गया:

@IBAction func buttonTapped(_ sender: AnyObject) { 
    asyncFunction() { 
     DispatchQueue.main.async { 
      self.performSegueWithIdentifier("someID", sender: sender) 
     } 
    } 
} 

मुझे आशा है कि यह आप में मदद करता है।

+0

अच्छी तरह से विचार करते हुए कि मैंने आईबी में सेगू बनाया है बटन से अगले दृश्य नियंत्रक को खींचने के लिए ctrl, मैं "दृश्यों के पीछे" किस तरह की सीगू क्रिया को रद्द कर सकता हूं? क्या वह अभी भी निष्पादित नहीं होगा? – u84six

+0

सीगू रद्द करने के साथ आपका क्या मतलब है? –

+0

ठीक है अगर मैं नियंत्रक को देखने के लिए बटन से खींचता हूं, तो जब मैं बटन पर क्लिक करता हूं तो segue होगा। यह मेरे कोड में नहीं होता है। जब आप कनेक्शन बनाते हैं तो यह दिया जाता है (मैंने जो क्रिया चुनी है वह "शो" है)। – u84six

-4

ऐसा लगता है जैसे आप इसे समकालिक रूप से चलाने के लिए देख रहे हैं; ताकि आप GCD कॉल dispatch_sync उपयोग कर रहे हैं के बजाय dispatch_async की पृष्ठभूमि धागे पर बड़े कार्य करने डाल, और जब आप डाल बातें dispatch_sync(dispatch_get_main_queue(), ^{ // handle error or segue }

+0

क्या मैं यह कॉल करने में सक्षम हूं और प्रतीक्षा टाइमर भी दिखा सकता हूं? – u84six

+1

आप बैकग्राउंड थ्रेड पर प्रेषण से पहले एक प्रतीक्षा टाइमर दिखा सकते हैं, और चीजों को मुख्य थ्रेड – aduflo

+0

@aduflo पर वापस ले जाने के बाद इसे हटा सकते हैं, आपने कहा कि यह समस्या को संभालने के लिए अनुशंसित तरीका नहीं है, async कॉल मुख्य रूप से फ्रीज से बचने के लिए बना है यूआई के। –

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

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