79 votes

iOS télécharger et enregistrer l'image dans l'application

Est-il possible pour moi de télécharger une image d'un site Web et de l'enregistrer en permanence dans mon application? Je n'en ai vraiment aucune idée, mais cela ferait une fonctionnalité intéressante pour mon application.

94voto

0x7fffffff Points 40133

Vieux post, mais je vais me jeter sur quelques exemples à l'aide de requêtes asynchrones.

D'abord, les blocs d' NSURLConnection:

- (void)NSURLConnectionExample
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/images/srpr/logo3w.png"] cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:10.0];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err){
        if (!err && data) {
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documents = [paths objectAtIndex:0];
            NSString *finalPath = [documents stringByAppendingPathComponent:@"myImageName.png"];
            [data writeToFile:finalPath atomically:YES];
        }
    }];
}

Ensuite, nous avons ASIHTTPRequest, une commodité wrapper pour CFNetwork. L'ASI peut-être pas aussi bien adapté à cette base de l'utiliser car il y a beaucoup moins de configurer impliqués dans l'utilisation de NSURLConnection. Toutefois, si vous avez un va-et-vient entre un lot de base des requêtes HTTP et de la connexion avec le RESTE des services, alors je vous recommande vraiment.

- (void)ASIHTTPRequestExample
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.com/images/srpr/logo3w.png"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestFinished:)];
    [request setDidFailSelector:@selector(requestFailed:)];

    [[NSOperationQueue mainQueue] addOperation:request];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documents = [paths objectAtIndex:0];
    NSString *finalPath = [documents stringByAppendingPathComponent:@"myImageName.png"];
    [[request responseData] writeToFile:finalPath atomically:YES];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"%@",error);
}

Et enfin, Grand Central Dispatch.

- (void)GrandCentralDispatchExample
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documents = [paths objectAtIndex:0];
    NSString *finalPath = [documents stringByAppendingPathComponent:@"myImageName.png"];

    dispatch_queue_t imageQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);

    dispatch_async(imageQueue, ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com/images/srpr/logo3w.png"]];
                             dispatch_async(dispatch_get_main_queue(), ^{
                                 [data writeToFile:finalPath atomically:YES];
                             });

    });
}

51voto

Jhaliya Points 24039

13voto

cem Points 2301

C'est le concept principal. S'amuser ;)

 NSURL *url = [NSURL URLWithString:@"http://example.com/yourImage.png"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
path = [path stringByAppendingString:@"/yourLocalImage.png"];
[data writeToFile:path atomically:YES];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X