खोज…


परिचय

संबंधित विषय: ग्रैंड सेंट्रल डिस्पैच

वाक्य - विन्यास

  • dispatch_async - एक अलग कतार में कोड का एक ब्लॉक चलाता है, और वर्तमान कतार को बंद नहीं करता है। यदि एक प्रेषण की तुलना में कतार एक अलग थ्रेड पर है, तो जिस पर डिस्पैच_ससंक को कॉल किया गया था, प्रेषण में कोड चलेगा, जबकि प्रेषण के बाद कोड भी चलेगा
  • dispatch_sync - एक अलग कतार में कोड का एक ब्लॉक चलाता है, और वर्तमान कतार को रोक देता है। यदि कतार एक प्रेषण की तुलना में एक अलग थ्रेड पर है, तो जिस पर डिस्पैच_सुंक को कॉल किया गया था, ब्लॉक में कोड चलेगा, और थ्रेड पर निष्पादन जहां विधि को बुलाया गया था, वह समाप्त होने के बाद ही फिर से शुरू होगा।

पैरामीटर

पंक्ति प्रेषण ब्लॉक में कोड कि कतार में चलेगा। एक कतार एक धागे की तरह है (लेकिन बिल्कुल वैसा ही नहीं); विभिन्न कतारों में कोड समानांतर में चल सकते हैं। मुख्य धागे के लिए कतार प्राप्त करने के लिए dispatch_get_main_queue का उपयोग करें। एक नई कतार बनाने के लिए, जो बदले में एक नया धागा बनाता है, dispatch_queue_create("QUEUE_NAME", DISPATCH_QUEUE_CONCURRENT) । पहला पैरामीटर कतार का नाम है, जो डिबगर में प्रदर्शित होता है यदि आप ब्लॉक करते समय रोकते हैं। जब तक आप एक से अधिक dispatch_async या dispatch_sync कॉल के लिए एक ही कतार का उपयोग नहीं करना चाहते तब तक दूसरा पैरामीटर मायने नहीं रखता। यह बताता है कि जब एक और ब्लॉक एक ही कतार में रखा जाता है तो क्या होता है; DISPATCH_QUEUE_CONCURRENT दोनों ब्लॉकों को एक ही समय में चलाने का कारण बनेगा, जबकि DISPATCH_QUEUE_SERIAL दूसरे ब्लॉक को समाप्त करने के लिए पहले ब्लॉक का इंतजार करेगा।
खंड मैथा इस ब्लॉक कतार में चलेंगे में कोड queue ; वह कोड डालें जिसे आप अलग कतार में चलाना चाहते हैं। एक सहायक टिप: यदि आप इसे Xcode में लिख रहे हैं और ब्लॉक तर्क के चारों ओर नीली रूपरेखा है, तो तर्क पर डबल क्लिक करें और Xcode स्वचालित रूप से एक खाली ब्लॉक बना देगा (यह किसी भी फ़ंक्शन या विधि में सभी ब्लॉक तर्क पर लागू होता है)

टिप्पणियों

जब भी आप एक अलग थ्रेड पर कुछ करते हैं, जो कतारों का उपयोग करते समय होता है, तो थ्रेड सुरक्षा को बनाए रखना महत्वपूर्ण है। कुछ तरीके, विशेष रूप से UIView s के लिए, मुख्य धागे के अलावा अन्य थ्रेड पर काम और / या क्रैश नहीं कर सकते हैं। इसके अलावा, यह सुनिश्चित करें कि कुछ भी नहीं बदलना (चर, गुण, आदि) जिसका उपयोग मुख्य धागे पर भी किया जा रहा है, जब तक कि आप इस परिवर्तन के लिए तैयार न हों

रनिंग कोड समवर्ती - अन्य कोड चलाते समय कोड

कहते हैं कि आप एक्शन में प्रदर्शन करना चाहते हैं (इस मामले में, "फू" लॉगिंग), जबकि कुछ और कर रहे हैं ("बार" लॉगिंग)। आम तौर पर, यदि आप संगामिति का उपयोग नहीं करते हैं, तो इनमें से एक कार्रवाई पूरी तरह से निष्पादित होने वाली है, और दूसरा रन पूरी तरह से समाप्त होने के बाद ही चलेगा। लेकिन संगामिति के साथ, आप एक ही समय में दोनों क्रियाओं को चला सकते हैं:

dispatch_async(dispatch_queue_create("Foo", DISPATCH_QUEUE_CONCURRENT), ^{
    for (int i = 0; i < 100; i++) {
        NSLog(@"Foo");
        usleep(100000);
    }
});

for (int i = 0; i < 100; i++) {
    NSLog(@"Bar");
    usleep(50000);
}

यह "फू" 100 बार लॉग करेगा, हर बार लॉग करने पर 100ms के लिए रुक जाएगा, लेकिन यह एक अलग धागे पर यह सब करेगा। जबकि Foo को लॉग किया जा रहा है, उसी समय "बार" को 50ms के अंतराल पर भी लॉग किया जाएगा। आपको आदर्श रूप से "फू" और "बार्स" को एक साथ मिलाकर देखना चाहिए

मुख्य धागे पर निष्पादित

जब एसिंक्रोनस रूप से कार्य करते हैं तो आमतौर पर यह सुनिश्चित करने की आवश्यकता होती है कि कोड का एक टुकड़ा मुख्य धागे पर चलाया जाए। उदाहरण के लिए आप REST API को अतुल्यकालिक रूप से हिट करना चाहते हैं, लेकिन परिणाम को स्क्रीन पर एक UILabel में डाल सकते हैं। UILabel को अपडेट करने से पहले आपको यह सुनिश्चित करना होगा कि आपका कोड मुख्य धागे पर चलाया गया है:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Perform expensive tasks
    //...

    //Now before updating the UI, ensure we are back on the main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        label.text = //....
    });
}

जब भी आप स्क्रीन पर दृश्य अपडेट करते हैं, तो हमेशा सुनिश्चित करें कि आप मुख्य धागे पर ऐसा कर रहे हैं, अन्यथा अपरिभाषित व्यवहार हो सकता है।

डिस्पैच समूह - अन्य धागे के पूरा होने का इंतजार।

dispatch_group_t preapreWaitingGroup = dispatch_group_create();

dispatch_group_enter(preapreWaitingGroup);
[self doAsynchronousTaskWithComplete:^(id someResults, NSError *error) { 
    // Notify that this task has been completed.
    dispatch_group_leave(preapreWaitingGroup);  
}]

dispatch_group_enter(preapreWaitingGroup);
[self doOtherAsynchronousTaskWithComplete:^(id someResults, NSError *error) { 
    dispatch_group_leave(preapreWaitingGroup);  
}]

dispatch_group_notify(preapreWaitingGroup, dispatch_get_main_queue(), ^{
    // This block will be executed once all above threads completed and call dispatch_group_leave
    NSLog(@"Prepare completed. I'm readyyyy");
});

अद्यतन 1. स्विफ्ट 3 संस्करण।

let prepareGroup = DispatchGroup()
prepareGroup.enter()
doAsynchronousTaskWithComplete() { (someResults, error) in
    // Notify that this task has been completed.
    prepareGroup.leave()
}

prepareGroup.enter()
doOtherAsynchronousTaskWithComplete() { (someResults, error) in
    // Notify that this task has been completed.
    prepareGroup.leave()
}

prepareGroup.notify(queue: DispatchQueue.main) {
    // This block will be executed once all above threads completed and call dispatch_group_leave
    print("Prepare completed. I'm readyyyy")
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow