2009-08-26 6 views

Odpowiedz

13

Łatwym sposobem jest skorzystanie z wygodnych metod NSData: initWithContentOfURL: i writeToFile:atomically:, aby uzyskać odpowiednio dane i odpowiednio je zapisać. Pamiętaj, że jest to synchroniczne i blokuje każdy wątek, który wykonasz, aż do zakończenia pobierania i zapisu.

Na przykład:

// 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];

Jeżeli metoda documentsDirectory kradzieży bezwstydnie z this question:

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

Jednakże, chyba że masz zamiar wkręcić ją sobie ten przestanie aktywność UI natomiast pobierania plików. Możesz zamiast tego chcieć zajrzeć do NSURLConnection i jego delegata - to pobiera w tle i powiadamia delegata o danych pobranych asynchronicznie, abyś mógł zbudować instancję NSMutableData, a następnie wypisać ją po zakończeniu połączenia. Twój delegat może zawierać metod takich jak:

- (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]; 
}

małe szczegóły, takie jak deklarowania dataAccumulator i obsługi błędów, pozostawia czytelnikowi :)

ważne dokumenty:

+0

Dzięki ! Ummm ... Synchroniczny? Czy to oznacza, że ​​lepiej użyć "koła postępu/paska" podczas wykonywania pracy? – RexOnRoids

+2

Synchroniczne oznacza, że ​​cała aktywność w twoim programie (no, główny wątek) zostanie całkowicie zatrzymana do czasu zakończenia pobierania. Oznacza to, że interfejs użytkownika będzie zamrożony dla użytkownika, a błystki nie zaczną nawet animować, dopóki nie zostanie ukończone pobieranie (co czyni je całkiem bezużytecznymi). Druga metoda, asynchroniczne pobieranie, pozwala programowi kontynuować pracę na pierwszym planie podczas pobierania w tle. Tak czy inaczej, tak, powinieneś użyć jakiegoś wskaźnika postępu. – Tim

Powiązane problemy