2011-01-02 12 views
7

अरे! मुझे यह जानने की ज़रूरत है कि मैं अपने आईओएस एप्लिकेशन को एप्लिकेशन की पृष्ठभूमि में डाउनलोड कैसे शुरू कर सकता हूं (जैसे, ऐपडिलेगेट फ़ाइल में डाउनलोड चलाएं) ताकि बदलना व्यू कंट्रोलर डाउनलोड को बाधित या रद्द नहीं करेगा। मुझे UIProgressView ऑब्जेक्ट को सेट करने के लिए डाउनलोड की प्रगति (0.00000 - 1.00000) प्राप्त करने में भी सक्षम होना चाहिए, जिसका अर्थ है कि मुझे - (void)progressDidChangeTo:(int)progress फ़ंक्शन की आवश्यकता है।आईओएस आवेदन पृष्ठभूमि डाउनलोड

उत्तर

18

बस ASIHTTPRequest का उपयोग जिस तरह से NSURLRequest की तुलना में आसान है और आप वास्तव में क्या जरूरत है। यह examples जो दिखाता है कि पृष्ठभूमि में कैसे डाउनलोड करें और प्रगति की रिपोर्ट कैसे करें।

मैं ऐपडिलेगेट में सीधे कुछ भी डाउनलोड नहीं करूंगा। इसके बजाय मैं केवल उस उद्देश्य के लिए एक अलग वर्ग बनाउंगा। आइए इसे MyService पर कॉल करें, फिर मैं अपने ऐप प्रतिनिधि में उस कक्षा को प्रारंभ करूंगा।

कक्षा एक सिंगलटन के रूप में काम कर सकती है या प्रत्येक दृश्य नियंत्रक को पास की जा सकती है जिसके लिए इसकी आवश्यकता होती है।

MyService कक्षा में मैं ASINetworkQueue और अनुरोध तैयार करने के लिए अनुरोधों को संभालने के लिए कुछ विधियों को जोड़ूंगा। यहां एएसआई उदाहरणों का कोड दिया गया है जिनका उपयोग आप कर सकते हैं:

- (IBAction)startBackgroundDownloading:(id)sender 
{ 
    if (!self.queue) { 
     self.queue = [[[ASINetworkQueue alloc] init] autorelease]; 
    } 

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestDone:)]; 
    [request setDidFailSelector:@selector(requestWentWrong:)]; 
    [self.queue addOperation:request]; //queue is an NSOperationQueue 
    [self.queue go]; 
} 

- (void)requestDone:(ASIHTTPRequest *)request 
{ 
    NSString *response = [request responseString]; 
    //Do something useful with the content of that request. 
} 

- (void)requestWentWrong:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
} 

यदि आपको प्रगति पट्टी सेट करने की आवश्यकता है। मैं बस अपना MyService कक्षा में ASINetworkQueue की setDownloadProgressDelegate बेनकाब और उस तरह मेरे ViewControllers में यह तय करेगा: Btw

[[MyService service] setDownloadProgressDelegate: self.myUIProgressView]; 

। यदि आपको ऐप से बाहर निकलने पर भी डाउनलोड करना जारी रखना है, तो आप YES को अपने अनुरोध की ShouldContinueWhenAppEntersBackground संपत्ति सेट कर सकते हैं।

+0

... मैं हूं। मुझे AppDelegate फ़ाइल में होने वाली डाउनलोड की आवश्यकता है, ताकि डाउनलोड शुरू होने पर UIViewController प्रारंभ होने पर डाउनलोड बंद नहीं होगा। मुझे यह जानने की ज़रूरत है कि मैं ASIHTTPRequest ऑब्जेक्ट को शुरू करने और एक्सेस करने के लिए UIViewController कैसे प्राप्त कर सकता हूं, लेकिन ऐपडिलेगेट में ऑब्जेक्ट आयोजित किया गया है। –

+0

@ हांकवेब, मैंने अभी अपना जवाब अपडेट कर लिया है। –

+0

समस्या यह है कि जब मेरा ऐप बैकग्राउंड से वापस आ रहा है तो रिपोर्ट विफलता ASIHTTPRequest.m में कॉल की जाएगी। मैं वैसे ही उपयोग कर रहा हूं जैसा आपने अपनी पोस्ट में सुझाया था और कन्फॉन्टाइन WhenAppEntersBackground YES पर सेट है। –

3

आप एक एसिंक्रोनस अनुरोध शुरू करने के लिए NSURLConnection का उपयोग कर सकते हैं जो आपके यूआई को जमे हुए नहीं होने देगा।

NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url]; 
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
[urlRequest release]; 

क्रम में अपनी प्रगति के लिए आप उपयोग कर सकते हैं: response.expectedContentLength का निरीक्षण किया और उसके बाद के लिए

connection:didReceiveResponse:(NSURLResponse *)response; 

प्रतिनिधि कॉल का उपयोग

connection:didReceiveData:(NSData *)data 
आप की तरह कुछ कर रही द्वारा यह कर सकते हैं डाउनलोड किए गए डेटा की मात्रा को ट्रैक करने और प्रतिशत की गणना करने के लिए

आशा इस मदद करता है, Moszi

+0

मेरे पास ASIHTTPRequest का उपयोग करके डाउनलोड करने का हिस्सा है, मुझे केवल यह जानने की आवश्यकता है कि वर्तमान ओपन UIViewController की बजाय पृष्ठभूमि में शुरू करने के लिए डाउनलोड को कैसे कार्यान्वित किया जाए, ताकि जब दृश्य नियंत्रक को खारिज कर दिया जाए, तो डाउनलोड जारी रहता है। –

+0

आप अपने डाउनलोड के प्रबंधन के लिए एक सिंगलटन क्लास बना सकते हैं, इस प्रकार यह क्लास चारों ओर होगा, भले ही आपका व्यू कंट्रोलर डेलोक-एड है। (विकिपीडिया पर सिंगलटन पैटर्न: http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi