आपका प्रश्न थोड़ा अजीब है। आपने इस मुद्दे को असंभव रूप से बाधित कर दिया है। किसी भी प्रक्रिया को रोकने के लिए आपके पास "प्रतीक्षा" कोड की एक पंक्ति नहीं हो सकती है, इस मामले में जो भी लूप चल रहा है,
यदि आप चाहते हैं तो आप एक सिंक्रोनस कॉल का उपयोग कर सकते हैं, यह नहीं करता अपने ऐप को अवरुद्ध न करें, यह केवल उस धागे को अवरुद्ध करता है जिस पर इसे निष्पादित किया जाता है। आपके उदाहरण में, आपके पास एक लूप है जो लगातार रिमोट डेटा प्राप्त कर रहा है और आप चाहते हैं कि आपका यूआई प्रतिबिंबित न हो जाए। लेकिन आप नहीं चाहते कि आपका यूआई अवरुद्ध हो। इसका मतलब है कि, आपके लूप के साथ यह धागा पहले से ही पृष्ठभूमि थ्रेड पर होना चाहिए ताकि आप अपने यूआई थ्रेड को अवरुद्ध करने वाले लूप w/o में एक सिंक्रोनस कॉल करने के लिए स्वतंत्र महसूस कर सकें। यदि लूप यूआई थ्रेड पर है तो आपको इसे वही करने के लिए इसे बदलने की जरूरत है।
आप एसिंक्रोनस कनेक्शन का उपयोग करके भी ऐसा कर सकते हैं। उस स्थिति में, आपका ऑपरेशन वास्तविक रूप से तेज़ी से पूरा हो सकता है बी/सी आप एक ही समय में कई अनुरोध प्रगति कर सकते हैं। यदि आप इसे इस तरह करते हैं, तो आपका लूप यूआई थ्रेड पर बना सकता है और आपको बस सभी कनेक्शन ट्रैक करने की आवश्यकता है ताकि जब वे समाप्त हो जाएं तो आप उस स्थिति को प्रासंगिक नियंत्रकों से संवाद कर सकते हैं। लोडिंग स्थिति को ट्रैक करने के लिए आपको iVars की आवश्यकता होगी और लोड होने पर संवाद करने के लिए या तो प्रोटोकॉल या NSNotification का उपयोग करें।
संपादित करें: पृष्ठभूमि धागे पर तुल्यकालिक कॉल का जोड़ा उदाहरण
आप पाश पूरी तरह से केवल खत्म जब सभी अनुरोधों को खत्म कर रहे हैं और न अपने यूआई यहाँ धागा एक सरल उदाहरण है अवरुद्ध करना चाहते हैं:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// post an NSNotification that loading has started
for (x = 0; x < numberOfRequests; x++) {
// create the NSURLRequest for this loop iteration
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
// do something with the data, response, error, etc
}
// post an NSNotification that loading is finished
});
जो भी ऑब्जेक्ट्स लोडिंग स्थिति दिखाने की ज़रूरत है, उसे यहां पोस्ट की जाने वाली अधिसूचनाओं को देख और संभालना चाहिए।लूप पृष्ठभूमि थ्रेड पर आपके सभी अनुरोधों को सिंक्रनाइज़ कर देगा और आपका यूआई थ्रेड अनब्लॉक और उत्तरदायी होगा। ऐसा करने का यह एकमात्र तरीका नहीं है, और वास्तव में, मैं इसे एसिंक कनेक्शन का उपयोग करके स्वयं करता हूं, लेकिन यह एक सरल उदाहरण है कि आप जो चाहते हैं उसे प्राप्त करने के लिए।
किसी भी कारण है कि आप कर सकते हैं नहीं बस है कि प्रतिनिधि से बजाय वहीं के पाश में "अगले" सामान? :) –
क्या पैरालेल में कई अनुरोध शुरू करने से बचने का उद्देश्य है?यदि ऐसा है, तो सर्वर से अगले परिणाम लाने के लिए आपकी प्रतिनिधि विधि जिम्मेदार हो सकती है। बहुत कम स्थितियां हैं जहां आप वास्तव में एक HTTP अनुरोध पर अवरुद्ध करना चाहते हैं, खासकर यदि आप उनमें से कई कर रहे हैं। –
मैं ओपी के समान स्थिति में भाग गया, जहां मेरे पास एक ऐप था जो पृष्ठभूमि थ्रेड पर सिंक्रोनस कॉल का भारी इस्तेमाल करता था, और अब कस्टम प्रमाणीकरण (NSURLConnection के प्रतिनिधि विधियों का उपयोग करके) का समर्थन करना चाहता था, जो एसिंक्रोनस उपयोग को अनिवार्य करता है। इसके बजाय ऐप को फिर से लिखना, मैं मूल रूप से उन्हें सिंक्रोनस बनाने के लिए एसिंक्रोनस कॉल को "लपेट" सकता था, क्योंकि वे पृष्ठभूमि थ्रेड पर पहले से ही होते हैं, सब कुछ अच्छा है। – Aaron