2009-08-26 6 views
5

मेरे पास मेरे रिमोट सर्वर पर एक फ़ोल्डर है जिसमें इसमें कुछ .png फ़ाइलें हैं। मैं इन्हें अपने ऐप के भीतर से डाउनलोड करना चाहता हूं और उन्हें ऐप्स 'दस्तावेज़' फ़ोल्डर में स्टोर करना चाहता हूं। मैं यह कैसे कर सकता हूँ?इंटरनेट से फ़ाइलों को डाउनलोड करने और आईफोन पर 'दस्तावेज़' में सहेजने के लिए कैसे?

उत्तर

13

डेटा प्राप्त करने और इसे लिखने के लिए एनएसडीटा की सुविधा विधियों initWithContentOfURL: और writeToFile:atomically: का उपयोग करना आसान तरीका है। ध्यान रखें कि यह तुल्यकालिक है और जो भी थ्रेड आप इसे निष्पादित करते हैं उसे तब तक अवरुद्ध कर देगा जब तक कि fetch और लिखना पूरा न हो जाए।

उदाहरण के लिए:

// Create and escape the URL for the fetch 
NSString *URLString = @"http://example.com/example.png"; 
NSURL *URL = [NSURL URLWithString: 
       [URLString stringByAddingPercentEscapesUsingEncoding: 
          NSASCIIStringEncoding]]; 

// Do the fetch - blocks! 
NSData *imageData = [NSData dataWithContentsOfURL:URL]; 
if(imageData == nil) { 
    // Error - handle appropriately 
} 

// Do the write 
NSString *filePath = [[self documentsDirectory] 
         stringByAppendingPathComponent:@"image.png"]; 
[imageData writeToFile:filePath atomically:YES];

कहाँ documentsDirectory विधि this question से बेशर्म चोरी हो जाता है:

- (NSString *)documentsDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    return [paths objectAtIndex:0]; 
}

हालांकि, जब तक आप का इरादा यह सूत्र में बाँधना अपने आप को इस यूआई गतिविधि जबकि फ़ाइल डाउनलोड बंद हो जाएगा। आप इसके बजाय NSURLConnection और उसके प्रतिनिधि को देखना चाहते हैं - यह पृष्ठभूमि में डाउनलोड करता है और असीमित रूप से डाउनलोड किए गए डेटा के बारे में एक प्रतिनिधि को सूचित करता है, ताकि आप एनएसएमयूटेबलडेटा का एक उदाहरण बना सकें, फिर कनेक्शन के होने पर इसे लिखें। आपका प्रतिनिधि की तरह तरीकों शामिल हो सकता है:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the data to some preexisting @property NSMutableData *dataAccumulator; 
    [self.dataAccumulator appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Do the write 
    NSString *filePath = [[self documentsDirectory] 
          stringByAppendingPathComponent:@"image.png"]; 
    [imageData writeToFile:filePath atomically:YES]; 
}

छोटे विवरण, dataAccumulator घोषित करने और त्रुटियों से निपटने की तरह, पाठक :) करने के लिए छोड़ दिया जाता है

महत्वपूर्ण दस्तावेजों:

+0

धन्यवाद ! Ummm ... तुल्यकालिक? क्या इसका मतलब यह है कि काम पूरा होने के दौरान मैंने "प्रगति व्हील/बार" का बेहतर उपयोग किया था? – RexOnRoids

+2

सिंक्रोनस का मतलब है कि आपके प्रोग्राम में सभी गतिविधियां (अच्छी तरह से, मुख्य धागा) डाउनलोड समाप्त होने तक पूरी तरह से बंद हो जाएंगी। इसका मतलब है कि यूआई उपयोगकर्ता को जमे हुए दिखाई देगा, और डाउनलोड करने के बाद स्पिनर एनिमेटिंग शुरू नहीं करेंगे (उन्हें बहुत बेकार प्रस्तुत करना)। दूसरी विधि, एक एसिंक्रोनस डाउनलोड, आपके प्रोग्राम को पृष्ठभूमि में डाउनलोड करते समय अग्रभूमि में काम करने देता है। किसी भी तरह से, हाँ, आपको किसी प्रकार की प्रगति संकेतक का उपयोग करना चाहिए। – Tim