2013-02-21 13 views
9

मैं कतारबद्ध ब्लॉक को फिर से शेड्यूल करने का प्रयास कर रहा हूं जो अद्यतन संचालन को संभालेगा। मुख्य लक्ष्य UI ऑब्जेक्ट्स (ऑनलाइन उपयोगकर्ता तालिका ...) को न्यूनतम मात्रा (UI अपडेट अनुरोध) के साथ अपडेट कर रहा है। (सर्वर कभी-कभी भारी मात्रा में अपडेट बारिश करता है, याय!)एक जीसीडी प्रेषण कतार से कतारबद्ध ब्लॉक को कैसे निकालें?

सादगी के लिए मुख्य परिदृश्य है;

  • dispatch_queue_t उदाहरण (कतार कि यूआई अद्यतन करने ब्लॉक दिए गए संभाल लेंगे) एक सीरियल प्रेषण कतार (निजी प्रेषण कतार) है

  • आपरेशन (यूआई अद्यतन करने ब्लॉक) टी राशि के साथ dispatch_after साथ निर्धारित है समय (प्रत्येक डेटा सेट अपडेट के लिए अद्यतन करने के बजाय, समय के भीतर अद्यतन अनुरोध एकत्रित करें और उनके लिए एक एकल यूआई अपडेट करें)

  • यदि हमारे डेटा सेट को अपडेट किया गया है, तो जांचें कि पहले से निर्धारित कार्यक्रम मौजूद है या नहीं। यदि हां, तो इसे dispatch_queue_t उदाहरण से अनदेखा करें। फिर समय की देरी के साथ उसी ब्लॉक को फिर से शेड्यूल करें।

इसके अलावा;

टी थोड़ी सी समय अंतराल है जो संभवतः उपयोगकर्ता द्वारा देखी जाएगी (जैसे 500 एमएस।) कोई वैकल्पिक दृष्टिकोण स्वागत है।

इसके पीछे मेरा उद्देश्य;

मैंने एंड्रॉइड हैंडलर के माध्यम से उसी तर्क को लागू किया (पोस्ट & रननेबल इंस्टेंस के साथ कॉलबैक संयोजन हटाएं) और मुझे उम्मीद है कि मैं आईओएस पर इसे प्राप्त कर सकता हूं।

संपादित करें:

रूप @Sven सुझाव NSOperationQueue के उपयोग परिदृश्य के लिए अधिक उपयुक्त है के रूप में वे एक NSOperation रद्द समर्थन करते हैं। मैं दस्तावेजों के माध्यम से skimmed और पाया;

रद्द कर रहा है संचालन एक बार एक ऑपरेशन वस्तु को प्रभावी ढंग से कतार के स्वामित्व में है और हटाया नहीं जा सकता एक ऑपरेशन कतार में जोड़ा। एक ऑपरेशन को हटाने का एकमात्र तरीका इसे रद्द करना है। आप अपनी रद्द विधि पर कॉल करके एक एकल ऑपरेशन ऑब्जेक्ट को रद्द कर सकते हैं या आप कतार ऑब्जेक्ट की cancelAllOperations विधि को कॉल करके कतार में सभी ऑपरेशन ऑब्जेक्ट्स को रद्द कर सकते हैं।

आपको केवल तभी ऑपरेशन रद्द करना चाहिए जब आप सुनिश्चित हों कि अब आपको उनकी आवश्यकता नहीं है। रद्द आदेश जारी करने से ऑपरेशन ऑब्जेक्ट को "रद्द" स्थिति में डाल दिया जाता है, जो इसे कभी भी चलाने से रोकता है। चूंकि एक रद्द किए गए ऑपरेशन को अभी भी "समाप्त" माना जाता है, इसलिए उस पर निर्भर वस्तुओं को निर्भरता को साफ़ करने के लिए उपयुक्त केवीओ नोटिफिकेशन प्राप्त होते हैं। इस प्रकार, कुछ महत्वपूर्ण घटनाओं के जवाब में सभी कतारबद्ध संचालन को रद्द करना अधिक आम है, जैसे आवेदन छोड़ने या उपयोगकर्ता विशेष रूप से रद्दीकरण का अनुरोध करने के बजाय रद्द करने का अनुरोध करते हैं।

उत्तर

7

आप प्रेषण कतार पर लगाए गए ऑपरेशन को हटा या अन्यथा नहीं बदल सकते हैं। रद्दीकरण का समर्थन करने वाले उच्च स्तर NSOperationQueue का उपयोग करने का प्रयास करें।

+0

मैं हमेशा NSOperationQueue पर एक नज़र रखना चाहता था क्योंकि इन्हें AFNetworking ढांचे में अत्यधिक उपयोग किया जाता है। धन्यवाद, यदि संभव हो, तो मैं एक उत्तर के रूप में एक नज़र डालें और चिह्नित करूंगा। –

13

यह आसानी से जीसीडी के साथ भी किया जा सकता है, यहां बड़े पैमाने पर एनएसओपरेशन क्यूई के लिए पहुंचने की आवश्यकता नहीं है।

बस dispatch_after के बजाय सीधे एक गैर-दोहराने वाले प्रेषण टाइमर स्रोत का उपयोग करें (जो कि टाइमर स्रोत के आसपास केवल एक सुविधा रैपर है, यह वास्तव में टाइमर बंद होने तक ब्लॉक को कतार में नहीं लगाता है)।

आप dispatch_source_set_timer() के साथ लंबित टाइमर स्रोत निष्पादन को फिर से निर्धारित कर सकते हैं।

+1

'NSOperationQueue' जीसीडी कतारों के आस-पास उद्देश्य-सी रैपर है। आपको लगता है कि यह _ "बड़ा हथौड़ा" _ क्यों है? मेरे लिए यह भी आसान इंटरफ़ेस है इसलिए मैं इसे पसंद करता हूं। – Tricertops

+11

यह गलत है। NSOperationQueue एक जीसीडी रैपर नहीं है, यह एक जटिल जटिल कतार, निर्भरता और प्राथमिकता ट्रैकिंग प्रणाली है जो पूरी तरह से जीसीडी से अलग है। यह कुछ सिंक्रनाइज़ेशन (स्पिनलॉक्स और म्यूटेक्स के साथ) के लिए आंतरिक रूप से जीसीडी का उपयोग करता है लेकिन क्लाइंट कोड के निष्पादन के मामले में जीसीडी का एकमात्र कनेक्शन यह है कि NSOperationQueue एक ऑपरेशन निष्पादित करने के अंत में वैश्विक समवर्ती कतार में dispatch_async() करता है ऐसा करने के लिए तैयार है। यह सभी जटिलता और लचीलापन लागत पर आता है, एनएसओपेरेशन क्यूई सरल संचालन के लिए जीसीडी की तुलना में धीमी बार कई बार है। – das

+5

एनएसओपरेशन जीसीडी के आस-पास एक उच्च स्तरीय समवर्ती रैपर है जो कतार के भीतर निर्भरताओं का प्रबंधन करने के लिए केवीओ और जीसीडी प्राइमेटिव का उपयोग करता है। क्यूए 1712, NSOperationQueue क्लास संदर्भ, साथ ही साथ Concurrency प्रोग्रामिंग गाइड सभी इसका उल्लेख करते हैं। एनएसओपरेशंस सरल संचालन के लिए जीसीडी की तुलना में धीमे समय के "1000s" नहीं होना चाहिए (यानी addOperationWithBlock)। यदि ऐसा है, तो आप कुछ और गलत कर रहे हैं। – quellish

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