2010-11-24 10 views
11

मैं एक सर्वर अनुरोध शुरू करना चाहता हूं, आप रद्द कर सकते हैं।उद्देश्य-सी: सर्वर थ्रेड में अनुरोध (जैसे एंड्रॉइड में AsyncTask)

मेरा विचार थ्रेड में अनुरोध शुरू करना है ताकि उपयोगकर्ता इंटरफ़ेस स्थिर न हो। तो आप "रद्द करें" -बटन पर क्लिक के साथ अनुरोध सहित पूरे धागे को मार सकते हैं।

एंड्रॉइड के साथ यह काम करता है: सर्वर अनुरोध "AsyncTask" में शुरू होता है और "onRurnurn()" - विधि के रूप में सर्वर अनुरोध समाप्त होने पर मैं प्रतिक्रिया दे सकता हूं।

आईओएस पर उद्देश्य-सी का उपयोग करके मैं इसे कैसे कार्यान्वित कर सकता हूं? मेरा पहला प्रयास "एनएसआईएनवोकेशनऑपरेशन" था। आप ऑपरेशन रद्द कर सकते हैं, लेकिन अनुरोध पूरा होने पर परिणाम संभालना मुश्किल है और परिणाम उपलब्ध हैं। मुझे लगता है कि एनएसआईएनवोकेशन ऑपरेशन मेरे मुद्दे का समाधान नहीं है।

क्या आप मुझे सलाह देंगे? क्या मेरे लिए सही विकल्प एनएसटीएचडी है?

बहुत बहुत धन्यवाद!

उत्तर

5

नोट!

था बेहद पुराना उत्तर केवल ऐतिहासिक उद्देश्यों के लिए है।

अद्भुत ASIHttpRequest लाइब्रेरी अब मौजूद नहीं है; प्रौद्योगिकी अब पूरी तरह से अलग है।


यह ASIHttpRequest के साथ ऐसा करना अविश्वसनीय सरल है।

(असिंक्रोनस इतना आसान है, ऐसा कोई कारण नहीं है कि आप कभी भी इसे असंकालिक रूप से नहीं करेंगे।)

यहां कुछ मोटे अर्क हैं जो आपको शुरू कर सकते हैं।

... 
ASIFormDataRequest *request; 
... 
NSURL *url = [NSURL URLWithString:@"https://blah.blah/blah.cgi?blah"]; 
request = [ASIFormDataRequest requestWithURL:url]; 

[request setPostValue:@"fred" forKey:@"username"]; 
[request setPostValue:@"flint" forKey:@"passie"]; 
[request setPostValue:@"stone" forKey:@"town"]; 

// send up data... 
[request setData:[NSData dataWithBytes:blah length:blah] forKey:@"thefile"]; 

// or perhaps something like... 
[request setData:imageData withFileName:@"blah.png" 
     andContentType:@"image/jpeg" forKey:@"photoimage"]; 

[request setDelegate:self]; 
[request setDidFinishSelector:@selector(postingDone:)]; 
[request setDidFailSelector:@selector(postingDoneProblem:)]; 
[request startAsynchronous]; 
... 

-(void) postingDone:(ASIHTTPRequest *)request 
    { 
    // it worked 
    } 
-(void) postingDoneProblem:(ASIHTTPRequest *)request 
    { 
    // failed 
    } 

वास्तव में कोई आसान नहीं हो सका। आप मूल रूप से केवल फ़ील्ड और मान टाइप कर रहे हैं।

अपने प्रश्न के अनुसार, यहां सिर्फ शून्य करने के लिए प्रतिनिधि सेट करें और फिर "अभी नहीं" यह कैसे आप एक "उड़ान" अनुरोध रद्द है ...।

[myRequest setDelegate:nil]; 
    [myRequest cancel]; 
    [myRequest release]; 

ASIHttpRequest "चमत्कार पुस्तकालय" है। यदि आप आईओएस के लिए नए हैं, तो ASIHttpRequest बस सबसे अधिक उपयोग की जाने वाली तीसरी पार्टी लाइब्रेरी है। अनिवार्य रूप से, 300,000 आईफोन ऐप्स का हर एक आईफोन ऐप इसका उपयोग करता है।

यदि संभव हो तो लड़के को कुछ रुपये दान करने के लिए सुनिश्चित करें - अगर वह उस पुस्तकालय का समर्थन करना बंद कर देता है, तो 100,000 आईफोन प्रोग्रामर खराब हो जाते हैं!

प्रलेखन मामूली बात है, एक बच्चे इसे का पालन कर सकते हैं:
http://allseeing-i.com/ASIHTTPRequest/How-to-use

"एक अतुल्यकालिक अनुरोध बनाना" यह शायद है - लगभग निश्चित रूप से - सबसे आश्चर्यजनक सरल नेटवर्किंग किसी भी मंच पर पुस्तकालय। जो कुछ आप वर्णन करते हैं, वह खुशी से करने के लिए तुच्छ है। का आनंद लें।

2

NSURLConnection डिफ़ॉल्ट रूप से async है और कनेक्शन स्थापित होने पर रद्द करने के साथ ही प्रतिनिधि तरीकों का समर्थन करता है, डेटा प्राप्त हो गया है या पूरा अनुरोध पूरा हो गया है।

पृष्ठभूमि में डेटा स्थानांतरण भी होता है ताकि यूआई उत्तरदायी रहे।

2

कोको का अंतर्निहित एसिंक नेटवर्किंग कोड थ्रेड-आधारित नहीं है लेकिन रन लूप ईवेंट के साथ काम करता है, लेकिन परिणाम (एसिंक्रोनस कनेक्शन) समान है।

+[NSURLConnection connectionWithRequest:delegate:] के साथ NSURLConnection बनाएं। आपके द्वारा सेट प्रतिनिधि को कनेक्शन की प्रगति के बारे में सूचित किया जाएगा और इसे -[NSURLConnection cancel] के साथ कभी भी रद्द कर सकता है।

1

चेक बाहर ASIHTTPRequest, विशेष रूप से, ASINetworkQueue उपवर्ग है, जो के रूप में वर्णित है:

ASINetworkQueue

NSOperationQueue का एक उपवर्ग कि अधिक अनुरोध भर में प्रगति को ट्रैक करने के लिए इस्तेमाल किया जा सकता है।

मैं केवल डिस्क है, जो लागू करने के लिए आसान था करने के लिए सीधे डाउनलोड करने के लिए एक भी तुल्यकालिक अनुरोध के लिए ASIHTTPRequest का उपयोग किया है, लेकिन मैं कतारों का उपयोग कर एक साथ कई अतुल्यकालिक सर्वर अनुरोधों का प्रबंधन करने की अच्छी रिपोर्ट सुना है।

1

एक बात सिफारिशों पर ध्यान दें का उपयोग करने के +[NSURLConnection connectionWithRequest:delegate:] है कि यह केवल आईओएस 4 के रूप में

यह कैसे से निपटने के लिए का एक उदाहरण के लिए http://blog.mugunthkumar.com/coding/ios4-issue-nsurlconnection-and-nsoperation/ देखने के मुख्य थ्रेड से बुलाया जाना चाहिए है।

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