2014-10-19 6 views
8

मैं है निम्नलिखित कोड में ग्रांड सेंट्रल डिस्पैच के लिए वाक्यविन्यास इसके बारे में पता। dispatch_async के भीतर कॉल रिटर्न निम्नलिखित संकलन त्रुटि:स्विफ्ट

Cannot invoke 'init' with an argument list of type '(dispatch_queue_t!,() ->() -> $T3)' 

मैं यह पता लगाने की कि यह कैसे लिखने के लिए इतना है कि यह काम करता है जैसे मैं किसी भी विचारों के लिए उद्देश्य सी धन्यवाद करने में सक्षम हो करने के लिए इस्तेमाल नहीं कर पा रहे!

+4

मैं पूरी तरह से निश्चय के साथ यह जानते हुए कि आपके बंद अंदर बिना नहीं कह सकता, लेकिन आप शायद [सिंगल-एक्सप्रेशन क्लोजर से लागू रिटर्न] में चल रहे हैं (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/ यूआईडी/TP40014097-Ch11-XID_157)। अपने आंतरिक बंद होने के अंत में एक स्पष्ट 'वापसी' डालने का प्रयास करें। –

+0

माइक एस, ऐसा लगता है कि काम किया है। धन्यवाद! यदि आप इसे उत्तर के रूप में पोस्ट करते हैं, तो मैं इसे सही के रूप में चिह्नित कर सकता हूं। – Sparklellama

उत्तर

17

स्विफ्ट में क्लोजर निहित रिटर्न हो सकता है अगर वे केवल एक ही अभिव्यक्ति होते हैं (देखें: Implicit Returns from Single-Expression Closures)। UI को अपडेट करने के लिए आपके आंतरिक बंद होने की संभावना में एक ही अभिव्यक्ति होती है। संकलक उस अभिव्यक्ति के परिणाम का उपयोग बंद होने के लिए वापसी मूल्य के रूप में कर रहा है जो बंद करने का हस्ताक्षर dispatch_async चाहता है हस्ताक्षर से मेल नहीं खाता है। चूंकि dispatch_async (या Void) को बंद करने कि () रिटर्न चाहता है, ठीक सिर्फ अपने बंद के अंत में एक स्पष्ट return जोड़ने के लिए है:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

    // Do stuff in the backgroud 

    dispatch_async(dispatch_get_main_queue()) { 

     // Do stuff on the UI thread 

     return 
    } 
} 
+0

आंतरिक बंद होने की सामग्री हैं: self.targetSprite? .texture = SKTexture (छवि: self.mainImage); ... तो यह जवाब स्पॉट पर है। – Sparklellama

0

आप को बंद करने paranthesis और ब्रेसिज़ गलत:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
    // Do stuff in the background 

    dispatch_async(dispatch_get_main_queue(), { 
     // Do stuff on the UI thread 
    }) 
}) 
+3

नहीं, चूंकि बंद अंतिम पैरामीटर है, यह एक पिछला बंद हो सकता है। यह समस्या नहीं है। – Lance

+0

मैं उपरोक्त कोड का उपयोग करता हूं और यह ठीक काम करता है। – zisoft

+2

हाँ, मैंने यह नहीं कहा कि यह नहीं होगा। मैं जो कह रहा हूं उसका कोड ठीक काम करता है। – Lance