दिलचस्प पोस्ट
एचटीसीएल को बीबीसीएड में कैसे परिवर्तित करें रेल में url सहायकों के लिए मैं डिफ़ॉल्ट होस्ट कैसे सेट करूं? Android में SQLite डेटाबेस बनाएँ क्या मैं एक आधार वर्ग के वर्चुअल फ़ंक्शन को कॉल कर सकता हूं अगर मैं इसे ओवरराइड कर रहा हूं? फ्लेक्सबॉक्स रैप कैसे परिवर्तित करें? जावा में एसएमएस कैसे भेजें सी ++ हेडर में "नेमस्पेस का उपयोग करना" मैं नेस्टेड / रिकर्सिव डिक्शनरी और लिस्ट में deserialize करने के लिए JSON.NET का उपयोग कैसे करूं? जेएलएल के साथ / बिना डेल्फी में सीएलआर होस्टिंग – उदाहरण लिंक समय पर उपयोग करने के लिए पुस्तकालय संस्करण को कैसे निर्दिष्ट करें? यूनिट टेस्टिंग डेटाबेस-चालित अनुप्रयोगों के लिए सबसे अच्छी रणनीति क्या है? जेएक्स-आरएस – कैसे एक साथ JSON और HTTP स्थिति कोड वापस करने के लिए? ActivePerl का उपयोग करते समय मुझे एक बैकअप एक्सटेंशन के साथ -i स्विच को निर्दिष्ट करना क्यों पड़ता है? लिनक्स में एक्लिप्स शुरू करने में त्रुटि: "जेवीएम समाप्त बाहर निकलें कोड = 13 " स्प्रिंग क्लासपाथ प्रीफ़िक्स फर्क

उद्देश्य-सी में लंबे समय से मतदान

मेरे पास एक ऐसा एप्लिकेशन है जो वेबसाइट पर वास्तविक समय अपडेट प्राप्त करने के लिए एपीआई का उपयोग करता है। वे जो लंबे समय तक मतदान तकनीक कहते हैं, उनका उपयोग करते हैं:

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

लंबे समय तक पोलिंग एक धक्का प्रौद्योगिकी नहीं है, लेकिन उन परिस्थितियों में इस्तेमाल किया जा सकता है जहां वास्तविक धक्का संभव नहीं है।

असल में यह आपके पास एक प्रतिक्रिया वापस मिल जाने के बाद सर्वर पर वापस अनुरोध करने का अनुरोध करता है यह एक iphone आवेदन में ऐसा करने का सबसे अच्छा तरीका क्या है? यह अंततः पृष्ठभूमि में चलना होगा

Solutions Collecting From Web of "उद्देश्य-सी में लंबे समय से मतदान"

यह बिल्कुल उपयोग-प्रकार का है जो NSURLConnection sendSynchronousRequest है NSURLConnection sendSynchronousRequest लिए एकदम सही है:

 - (void) longPoll { //create an autorelease pool for the thread NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; //compose the request NSError* error = nil; NSURLResponse* response = nil; NSURL* requestUrl = [NSURL URLWithString:@"http://www.mysite.com/pollUrl"]; NSURLRequest* request = [NSURLRequest requestWithURL:requestUrl]; //send the request (will block until a response comes back) NSData* responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; //pass the response on to the handler (can also check for errors here, if you want) [self performSelectorOnMainThread:@selector(dataReceived:) withObject:responseData waitUntilDone:YES]; //clear the pool [pool drain]; //send the next poll request [self performSelectorInBackground:@selector(longPoll) withObject: nil]; } - (void) startPoll { //not covered in this example: stopping the poll or ensuring that only 1 poll is active at any given time [self performSelectorInBackground:@selector(longPoll) withObject: nil]; } - (void) dataReceived: (NSData*) theData { //process the response here } 

वैकल्पिक रूप से, आप एसिंक I / O का उपयोग कर सकते हैं और एक ही बात को पूरा करने के लिए कॉलबैक का प्रतिनिधि बना सकते हैं, लेकिन इस मामले में वास्तव में एक तरह की मूर्खता होगी।

लंबे समय तक मतदान एक सर्वर के लिए एक पठन अनुरोध कर रहा है, सर्वर को अनुरोध मिलता है, आपको पता चलता है कि आपको भेजने के लिए कोई दिलचस्पी नहीं है, और कुछ भी नहीं लौटाने के बजाय, या "रिक्त", इसके बजाय यह कुछ दिलचस्प दिखाई देने तक अनुरोध पर रखता है । एक बार यह कुछ पाता है, यह गर्तिका को लिखता है और ग्राहक को डेटा प्राप्त होता है।

विस्तार यह है कि इस पूरे समय के लिए, जेनेटिक सॉकेट प्रोग्रामिंग का उपयोग करते हुए, क्लाइंट को अवरुद्ध कर दिया गया है और कॉल को पढ़ने वाले सॉकेट पर लटकाया गया है।

इस से निपटने के दो तरीके हैं (अच्छी तरह से, यदि आप मुख्य थैली पर कई सेकंड के लिए फंस नहीं लगाते हैं, लेकिन हम उसे एक नहीं मानते हैं)।

  1. एक थ्रेड में सॉकेट हैंडलिंग कोड रखें इस मामले में, पूरी गर्तिका प्रक्रिया कार्यक्रम के भीतर एक स्वतंत्र धागे में है, इसलिए यह खुशी से एक प्रतिक्रिया के लिए इंतजार कर पढ़ने पर फंस जाता है।

  2. अतुल्यकालिक सॉकेट हैंडलिंग का उपयोग करें इस मामले में, आपकी सॉकेट पढ़ी मुख्य थ्रेड को ब्लॉक नहीं करता है। इसके बजाय, आप कॉल बैक फ़ंक्शन में पास करते हैं जो सॉकेट पर गतिविधि का जवाब देते हैं, और फिर अपने मजे की तरह देखें मैक पर, CFSocket जो इस प्रकार की कार्यक्षमता को प्रदर्शित करता है यह अपने स्वयं के धागे को पैदा करता है, और चयन (2) के द्वारा सॉकेट कनेक्शन का प्रबंधन करता है।

CFSocket के बारे में बात करना यह एक बहुत अच्छी बात है

CFSocket संदेश पासिंग और इवेंटिंग के मैक मुहावरों में अच्छी तरह से फिट बैठता है, और संभवत: इस तरह के काम करने के लिए आपको क्या देखना चाहिए। एक ओबजे-सी क्लास आवरण भी बनाया गया है, जिसे यूएलएनसेट सॉकेट (पूर्व में नेटस्केट) कहा जाता है।