कैसे स्विफ्ट 3 में प्रेषण कतार बनाने के लिए


403

स्विफ्ट 2 में, मैं निम्नलिखित कोड के साथ कतार बनाने में सक्षम था:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)

लेकिन यह स्विफ्ट 3 में संकलित नहीं है।

स्विफ्ट 3 में इसे लिखने का पसंदीदा तरीका क्या है?



स्विफ्ट 4 में सीरियल कतार बनाने के लिए 3 अतिरिक्त परिम हैं। धारावाहिक कतार बनाने के लिए उनका उपयोग कैसे करें? DispatchQueue.init (लेबल:, qos:, विशेषताएँ:, autoreleaseFrequency: लक्ष्य
:)

@ nr5 कतार डिफ़ॉल्ट रूप से धारावाहिक हैं, इसलिए यह केवल DispatchQueue(label: "your-label")धारावाहिक कतार के लिए उपयोग करने के लिए पर्याप्त है । अतिरिक्त पैरामेट्स में सभी डिफ़ॉल्ट मान हैं।
jbg

जवाबों:


1131

समवर्ती कतार बनाना

let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {

}  

एक सीरियल कतार बनाएँ

let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync { 

}

असिंक्रोनस रूप से मुख्य कतार प्राप्त करें

DispatchQueue.main.async {

}

मुख्य कतार को समकालिक रूप से प्राप्त करें

DispatchQueue.main.sync {

}

एक बैकग्राउंड थ्रेड पाने के लिए

DispatchQueue.global(qos: .background).async {

}

Xcode 8.2 बीटा 2:

एक बैकग्राउंड थ्रेड पाने के लिए

DispatchQueue.global(qos: .default).async {

}

DispatchQueue.global().async {
    // qos' default value is ´DispatchQoS.QoSClass.default`
}

यदि आप इन कतारों के उपयोग के बारे में जानना चाहते हैं। इस उत्तर को देखें


3
attributes: .serialसीरियल कतार बनाते समय आप वास्तव में चूक सकते हैं let serialQueue = DispatchQueue(label: "queuename"):।
कीन जूल

15
Xcode 8 बीटा 4 में कोई .serial विकल्प नहीं है इसलिए आपको विशेषताओं में .concurrent को छोड़ कर सीरियल कतार बनाना होगा।
ओलेग शर्मन

मुझे Swift3 से DispatchQueue को objc में एक्सेस करने की आवश्यकता है, लेकिन निम्न त्रुटि मिली है कि '__strong dispatch_queue_t' (उर्फ 'NSObject <OS_ispispatch_queue> * __ strong') के एक प्रकार के साथ 'टाइप' OS_dispatch_queue_tue_tue_tue_tue_ टाइप करें के एक वेरिएंट को प्रारंभ नहीं कर सकता। = [स्विफ्टक्लास क्यू]; यह तेज का
डिस्पैचक्व्यू

DispatchQueue.main.asynchronously (DispatchQueue.main) {self.mapView.add (self.mapPolyline)} स्विफ्ट 3.0 में मैंने DispatchQueue.adlobal () के साथ आजमाया है। अतुल्यकालिक (DispatchQueue.main) {self.mapView.add (स्व। .mapPolyline)} लेकिन दोनों शो के रूप में "प्रकार dispathQuoue का मूल्य कोई भी सदस्य एसिंक्रोनस रूप है" एक ही त्रुटि
अबिरामी बाला

1
ओपी के कोड से, सेब "com.swift3.imageQueue" का उपयोग करने पर ध्यान केंद्रित क्यों करता है । मैं देखता हूं कि लेबल के 3 भाग हैं। ऐसा क्यों है? प्रत्येक भाग किसके लिए खड़ा है? मुझे फॉर्मेटिंग नहीं मिलती
हनी

55

के तहत संकलन> = स्विफ्ट 3 । इस उदाहरण में अधिकांश सिंटैक्स होते हैं जिनकी हमें आवश्यकता होती है।

QoS - सेवा सिंटैक्स की नई गुणवत्ता

weak self - चक्र को बनाए रखने के लिए बाधित करना

यदि स्वयं उपलब्ध नहीं है, तो कुछ भी न करें

async global utility queue- नेटवर्क क्वेरी के लिए, परिणाम की प्रतीक्षा नहीं करता है, यह एक समवर्ती कतार है, ब्लॉक (आमतौर पर) शुरू होने पर इंतजार नहीं करता है। समवर्ती कतार के लिए अपवाद तब हो सकता है, जब इसकी कार्य सीमा पहले पहुंच चुकी हो, फिर कतार अस्थायी रूप से एक सीरियल कतार में बदल जाती है और उस कतार में कुछ पिछले कार्य के पूरा होने तक प्रतीक्षा करती है।

async main queue- यूआई को छूने के लिए, ब्लॉक परिणाम का इंतजार नहीं करता है, लेकिन शुरुआत में इसके स्लॉट का इंतजार करता है। मुख्य कतार एक सीरियल कतार है।

बेशक, आपको इसमें कुछ त्रुटि जाँच करने की आवश्यकता है ...

DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in

    guard let strongSelf = self else { return }

    strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in

        if error != nil {
            print("error:\(error)")
        } else {
            DispatchQueue.main.async { () -> Void in
                activityIndicator.removeFromSuperview()
                strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
            }
        }
    }
}

6
स्विफ्ट 3 में कोडिंग करते समय, अपने पिछले कोड के 30% संघनक और हटाने के आदी हो जाएं :-)
t1ser

[कमजोर आत्म] उदाहरण के लिए धन्यवाद!
imike

1
यह बेहतर है guardकि शीर्ष पर selfनहीं है nil, ताकि कोड में से कोई भी निष्पादित नहीं होता है यदि यह nil, जैसे guard strongSelf = self else { return },।
स्कॉट गार्डनर

@ t1 क्या आप मुझे बता सकते हैं कि मैं स्विफ्ट 3 में कोड के साथ लिखे गए जीसीडी के लिए दस्तावेज कहां से पा सकता हूं? मैंने केवल ऑब्जेक्टिव सी में लिखा हुआ पाया है । यहां कोई मुझे WWDC के एक वीडियो की ओर इशारा कर रहा था, लेकिन मैं स्विफ्ट 3 में उदाहरणों के साथ आधिकारिक दस्तावेज पढ़ना चाहता हूं और इसे खोजने का कोई तरीका नहीं है।
bibscy 11

1
.global(qos: .background)IO (नेटवर्क अनुरोध) के लिए उपयोग न करें । उपयोग .global(qos: .default)या .global(qos: .utility)इसके बजाय।
पेड्रो पाउलो अमोरिम

28

XCode 8, स्विफ्ट 3 https://github.com/rpthomas/Jedisware में संकलित

 @IBAction func tap(_ sender: AnyObject) {

    let thisEmail = "emailaddress.com"
    let thisPassword = "myPassword" 

    DispatchQueue.global(qos: .background).async {

        // Validate user input

        let result = self.validate(thisEmail, password: thisPassword)

        // Go back to the main thread to update the UI
        DispatchQueue.main.async {
            if !result
            {
                self.displayFailureAlert()
            }

        }
    }

}

12

चूंकि ओपी प्रश्न पहले ही उत्तर दिया जा चुका है, इसलिए मैं केवल कुछ गति विचार जोड़ना चाहता हूं:

इससे आपको बहुत फर्क पड़ता है कि आप DispatchQueue.global में अपने async फ़ंक्शन को किस प्राथमिकता वर्ग को असाइन करते हैं ।

मैं विशेष रूप से iPhone X पर .background थ्रेड प्राथमिकता के साथ कार्य चलाने की अनुशंसा नहीं करता जहाँ कार्य कम पावर कोर पर आवंटित किया गया लगता है।

यहाँ एक कम्प्यूटेशनल रूप से गहन फ़ंक्शन से कुछ वास्तविक डेटा है जो XML फ़ाइल (बफ़रिंग के साथ) से पढ़ता है और डेटा प्रक्षेप को निष्पादित करता है:

डिवाइस का नाम / .background / .utility / .default / .userInitiated / .userInteractive

  1. iPhone X: 18.7 / 6.3s / 1.8s / 1.8s / 1.8s
  2. iPhone 7: 4.6 / 3.1 / 3.0 / 3.0 / 2.8 / 2.6
  3. iPhone 5s: 7.3s / 6.1s / 4.0s / 4.0s / 3.8s

ध्यान दें कि डेटा सेट सभी उपकरणों के लिए समान नहीं है। यह iPhone X में सबसे बड़ा और iPhone 5s पर सबसे छोटा है।


1
बढ़िया जानकारी। मेरी मदद की
Morgz

1
@Myk यदि उपयोगकर्ता ने पहल की है और / या यह उन परिणामों की प्रतीक्षा कर रहा है, जिन्हें आपको .userInitiated और .userInteractive का उपयोग करना चाहिए, ताकि कोई अन्य ऑपरेशन वापस न हो। अधिकांश अन्य मामलों में .default एक अच्छा विकल्प होगा।
कोस्मिन

6

मैंने ऐसा किया है और यह विशेष रूप से महत्वपूर्ण है यदि आप यूआईटेबल व्यू या यूआईपीविकार व्यू जैसे उपयोगकर्ता के बिना नए डेटा को दिखाने के लिए अपने यूआई को रिफ्रेश करना चाहते हैं।

    DispatchQueue.main.async
 {
   /*Write your thread code here*/
 }

3
 DispatchQueue.main.async {
          self.collectionView?.reloadData() // Depends if you were populating a collection view or table view
    }


OperationQueue.main.addOperation {
    self.lblGenre.text = self.movGenre
}

// यदि आप अपने व्यू-कॉन्ट्रैक्टर पर ऑब्जेक्ट्स (लेबल, इमेजव्यू, टेक्स्टव्यू) को पॉप्युलेट करने के लिए ऑपरेशन कतार का उपयोग करते हैं


2
   let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version

   let concurrentQueue = DispatchQueue(label:"com.swift3.imageQueue", attributes: .concurrent) //Swift 3 version

मैंने आपका कोड Xcode 8, स्विफ्ट 3 में फिर से काम किया और आपके स्विफ्ट 2 संस्करण के विपरीत परिवर्तन चिह्नित किए गए हैं।


यह साफ दिखता है कि मैंने क्या लिखा था। धन्यवाद।
गोसबोर्न 3

2

स्विफ्ट 3

आप स्विफ्ट कोड में कुछ क्लोजर कॉल करना चाहते हैं तो आप स्टोरीबोर्ड में बदलना चाहते हैं। किसी भी प्रकार के परिवर्तन को देखने के लिए आपका एप्लिकेशन क्रैश हो जाएगा

लेकिन आप डिस्पैच विधि का उपयोग करना चाहते हैं, आपका एप्लिकेशन क्रैश नहीं होगा

async विधि

DispatchQueue.main.async 
{
 //Write code here                                   

}

सिंक विधि

DispatchQueue.main.sync 
{
     //Write code here                                  

}

मैं सेवा कॉलिंग समय में async विधि का उपयोग करना चाहता हूं मेरा कोड DispatchQueue.main.async {let objstory1 = self.storyboard? .InstantiateViewController (withIdentifier: "HomeContController") के रूप में है! HomeViewController _ = self.navigationController; .pushViewController (objstory1, एनिमेटेड: गलत)}
Amul4608

1
कभी भी इस्तेमाल न करेंDispatchQueue.main.sync
trickster77777

मुख्य कतार पर सिंक कॉल निश्चित रूप से समस्याओं का कारण होगा।
टोफू योद्धा

2
DispatchQueue.main.async(execute: {

// write code

})

सीरियल कतार:

let serial = DispatchQueue(label: "Queuename")

serial.sync { 

 //Code Here

}

समवर्ती कतार:

 let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)

concurrent.sync {

 //Code Here
}

यह एक प्रेषण कतार नहीं बनाता है, यह सिर्फ रन लूप के माध्यम से एक टिक के बाद आपको मुख्य कतार पर रखता है।
बनाया



1

स्विफ्ट 5 के लिए अपडेट करें

सीरियल कतार

let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
    // code to execute
}

समवर्ती कतार

let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)

concurrentQueue.async {
// code to execute
}

से एप्पल प्रलेखन :

पैरामीटर

लेबल

कतार में संलग्न करने के लिए एक स्ट्रिंग लेबल विशिष्ट रूप से डिबगिंग टूल जैसे कि इंस्ट्रूमेंट्स, सैंपल, स्टैकशॉट्स और क्रैश रिपोर्ट में इसकी पहचान करता है। क्योंकि एप्लिकेशन, लाइब्रेरी और फ्रेमवर्क सभी अपनी प्रेषण कतार बना सकते हैं, एक रिवर्स-डीएनएस नामकरण शैली (com.example.myqueue) की सिफारिश की जाती है। यह पैरामीटर वैकल्पिक है और NULL हो सकता है।

क्यूओएस

गुणवत्ता सेवा के स्तर कतार के साथ संबद्ध करने के लिए। यह मान उस प्राथमिकता को निर्धारित करता है जिस पर सिस्टम निष्पादन के लिए कार्य शेड्यूल करता है। संभावित मानों की सूची के लिए, DispatchQoS.QoSClass देखें।

गुण

कतार से जुड़ने का गुण। समसामयिक विशेषता शामिल करें एक प्रेषण कतार बनाएँ जो समवर्ती कार्यों को निष्पादित करती है। यदि आप उस विशेषता को छोड़ देते हैं, तो प्रेषण कतार क्रमिक रूप से कार्य निष्पादित करती है।

autoreleaseFrequency

वह आवृत्ति जिससे ब्लॉक शेड्यूल किए गए ऑब्जेक्ट को ऑटोरेलिज़ करते हैं जो कतार शेड्यूल करते हैं। संभावित मानों की सूची के लिए, DispatchQueue.AutoreleaseFrequency देखें ।

लक्ष्य

ब्लॉक को निष्पादित करने के लिए लक्ष्य कतार। DISPATCH_TARGET_QUEUE_DEFAULT निर्दिष्ट करें यदि आप चाहते हैं कि प्रणाली एक कतार प्रदान करे जो वर्तमान वस्तु के लिए उपयुक्त हो।


-3

यह अब बस है:

let serialQueue = DispatchQueue(label: "my serial queue")

डिफ़ॉल्ट धारावाहिक है, समवर्ती प्राप्त करने के लिए, आप वैकल्पिक विशेषताओं तर्क का उपयोग करते हैं


आप बेहतर तरीके से अपना जवाब जोड़कर अपडेट करेंगे seiralQueue.async {}। @tylemol
DawnSong

-3
DispatchQueue.main.async(execute: {
   // code
})

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके शैक्षिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों के लिए समान के साथ अधिक उपयोगी होगा, लेकिन समान नहीं, प्रश्न। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टोबी स्पाइट

-4

आप इस कोड का उपयोग स्विफ्ट 3.0 में प्रेषण कतार बना सकते हैं

DispatchQueue.main.async
 {
   /*Write your code here*/
 }

   /* or */

let delayTime = DispatchTime.now() + Double(Int64(0.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)                   
DispatchQueue.main.asyncAfter(deadline: delayTime)
{
  /*Write your code here*/
}

1
क्षमा करें, यह प्रेषण कतार नहीं बना रहा है, जो रन लूप के माध्यम से एक टिक के बाद मुख्य कतार तक पहुंच रहा है।
buildsucceeded
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.