2016-06-22 10 views
0

Ich versuche Bilder von Webservice im Dokumentenverzeichnis zu speichern. Für ein gespeichertes Bild möchte ich es aus dem Dokumentenverzeichnis in der Tabellenansicht laden. Die Bilder sind von einer URL wie: - http://Address/App/User/Image/Puegeot_E7Speichern und Abrufen von Bildern aus Dokumentenverzeichnis in TableView?

Abruf von Webservice ist jedoch erfolgreich aus dem Dokumenten-Verzeichnis Ich bekomme immer Null Image.Kein scheinen zu finden, was hier falsch ist.

- (void)saveImage:(UIImage*)image withName:(NSString *)imageName 
{ 
    if (image != nil) 
    { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName]; 

     NSLog(@"Saving path %@",path); // Saving path /Users/computername/Library/Developer/CoreSimulator/Devices/7277F3D3-298C-451A-8607-8070A08650C7/data/Containers/Data/Application/D3AF4DD9-A4CD-42C8-A8EB-0F15C271EE61/Documents/CabImage/Puegeot_E7 

     NSData* data = UIImagePNGRepresentation(image); 
     [data writeToFile:path atomically:YES]; 
    } 
} 

- (UIImage *)getImageFromURL:(NSString *)fileURL 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fileURL]; 
    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]]; 
    NSLog(@"data %@",data); //This returns (null) 
    UIImage *result = [UIImage imageWithData:data]; 
    return result; 
} 

In tableView das ist, wie ich versuche, aus Dokumenten-Verzeichnis zu laden.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //default initialisation stuff 
    NSDictionary *obj = [responseArray objectAtIndex:indexPath.row]; 
    cell.imgVW.image = [UIImage imageNamed:@"default-car.png"]; 
    NSString *imgPath = obj[@"cabimage"]; 
    NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7 
    UIImage *imgFromDisk = [self getImageFromURL:imgPath]; 
    NSLog(@"imgFromDisk - %@",imgFromDisk); -> (null) 
    if (imgFromDisk) 
    { 
     cell.imgVW.image = imgFromDisk; 
    } 
    else 
    { 
     //download 
     NSURL *imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@User/%@",BASE_URL,imgPath]]; 

     self.task = [self.session downloadTaskWithURL:imageURL 
        completionHandler:^(NSURL *location,NSURLResponse *response,NSError *error) 
     { 
      NSData *img_data = [NSData dataWithContentsOfURL:imageURL]; 
      if (img_data) 
      { 
       UIImage *img = [UIImage imageWithData:img_data]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        ListCell *cell = (id)[tableView cellForRowAtIndexPath:indexPath]; 
        cell.imgVW.image = img;         
        [self saveImage:img withName:imgPath]; 

       }); 
      } 
     }]; 
     [self.task resume]; 
    } 
} 

Antwort

0

Zunächst empfehle ich Ihnen SDWebImage Bibliothek - ein asynchrones Bild Downloader mit Cache-Unterstützung. Die Verwendung ist einfach genug:

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] 
         placeholderImage:[UIImage imageNamed:@"placeholder.png"] 
          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
           ... completion code here ... 
          }]; 

Allerdings, wenn Sie es auf Ihre eigene Weise tun möchten.Sie sollten thess 2 Codezeile ändern:

UIImage *imgFromDisk = [self getImageFromURL:imgPath]; 

in diese:

UIImage *imgFromDisk = [self getImageFromURL:[imgPath lastPathComponent]]; 

und

[self saveImage:img withName:imgPath]; 

in diese:

[self saveImage:img withName:[imgPath lastPathComponent]]; 
+0

Danke..es funktioniert perfekt. SDWebImage sieht gut aus, ich wollte es nur ausprobieren, ohne eine Bibliothek zu benutzen. – icodes

+0

Keine Sorgen. Schön, dass es hilft –

1

Sie bekommen nil weil Sie nicht den richtigen Pfad bereitstellt, wo das Bild abzurufen. Sie verwenden nur den Namen des Bildes, aber Sie sollten den gleichen Pfad verwenden wie Sie es gespeichert haben.

So setzen:

NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName]; 

In Ihrer getImageFromURL Methode.

Verwenden Sie nicht nur den Bildnamen, um Ihr Bild abzurufen. Hoffe, das hilft!

(Sorry für die schlechte Layout meines Textes, ich bin auf meinem Handy eingeben)

+0

Gemäß Vorschlag, ich aktualisiert code.Wie immer noch das gleiche Problem. – icodes

2

Das Problem scheint offensichtlich von dem, was Sie in den Protokollen sind zu sehen:

NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7 

Das isn Weg nicht im Dokumentenverzeichnis.

Um festere Kontrolle über diese zu erhalten, müssen die Methode den Pfad speichern zurückzukehren, wo das Bild gespeichert wurde:

- (NSString *)saveImage:(UIImage*)image withName:(NSString *)imageName{ 
    // op code, then: 
    return path; 
} 

-Test, dass Sie ein Bild lesen können, zurück. (Dieser Code ist für Test, nicht für die App).

UIImage *testImage = [UIImage imageNamed:@"some_test_image"]; 
NSString *path = [self saveImage:testImage withName:@"test_name"]; 
UIImage *didItWork = [self getImageFromURL:path]; 
NSLog(@"did it work? %@", didItWork); 

Zurück zur realen Anwendung ... Nachdem der Weg vom Schreiben des Bildes in Ihrem Modell zurückgegeben:

UIImage *downloadedImage = // however you get this 
NSString * downloadedImageName = // however you get this 
NSDictionary *obj = [responseArray objectAtIndex:indexPath.row]; 
obj[@"cabbage"] = [self saveImage: downloadedImage withName:downloadedImageName]; 

Jetzt wissen wir, dass Ihre cellForRowAtIndexPath Methode, um den gespeicherten Pfad sehen, und wir wissen, aus dem Test, dass die Bilderzeugung von diesem Pfad funktioniert.