2015-03-06 24 views
8

mir dies mit URL zu BildansichtSchneller Weg Bild von einer URL zur Bildansicht in der Tabellenansicht Zelle laden

let url = NSURL(string: URL) 
let data = NSData(contentsOfURL: url!) 
self.releasephoto.image = UIImage(data: data!) 

Aber zu laden, wenn gibt es 10 Elemente in der Tabellenansicht Zelle mit verschiedenen Bildern, Scrollen wird langsamer und hängt

ich Bilder mit der Größe von 40 x 40 laden

ich frage mich, ob es einen besseren Weg, um URL-Bilder zu laden?

Antwort

21

Ich schlage vor, SDWebImage verwenden würde.

Nach der Installation werden Sie eine Brückenkopf für Swift machen müssen und schließen Sie diese Zeile:

#import "UIImageView+WebCache.h" 

Dann alles, was Sie brauchen in Ihrer cellForRowAtIndexPath Funktion zu tun, ist dies:

let url = NSURL(string: URL) 
self.releasephoto.sd_setImageWithURL(url) 

Das Schöne an dieser Bibliothek ist, dass sie das Bild automatisch zwischenspeichert, sodass es nur einmal heruntergeladen wird.

+0

Kann nicht eine Bridging-Header für Swift machen, wie geht das? –

+0

https: //bohemianpolymorph.wordpress.com/2014/07/11/manuell-hinzufügen-a-swift-Bridging-Header/ – Sam

+0

PERFEKT danke –

5

Sie müssen die Ansichten asynchron laden. Geben Sie zunächst ein Dummy oder ein leeres Bild ein. Laden Sie dann asynchron im Hintergrund alle Bilder für Zellen, die gerade angezeigt werden, in Ihr Modell. Wenn jedes Bild eintrifft, speichern Sie es im Modell und laden Sie die Tabellenansicht neu. So wird jedes Bild angezeigt, wenn es ankommt, aber Ihr Scrollen wird nicht verlangsamt, weil immer ein Bild ist - das leere oder Dummy, wenn Sie das Bild für diese Zeile oder das echte Bild nicht erhalten haben, wenn Sie habe es geholt.

Hier ist Beispielcode aus meinem Buch:

(.. Die volle Funktionsbeispiel ist here Und der Code für MyDownloader, die Klasse von self.downloader ist here)

Für zusätzliche Supereffizienz, Abbrechen des Downloads, wenn der Benutzer vor dem Eintreffen des Bilds eine Zeile aus der Ansicht scrollt. Auf diese Weise können Sie festlegen, wie viele Downloads gleichzeitig ausgeführt werden können.

+0

Insbesondere betrachten 'NSURLConnection.sendAsynchronousRequest' mit einem Rückruf, füllt in den Bilddaten. – BaseZen

0

Apple hat einen Beispielcode LazyTableImages, obwohl es in Objective-C ist. Genau wie bei @ Matt erwähnt, muss es asynchron durchgeführt werden.

0
NSURL *url = [NSURL URLWithString:@"http:url..."]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
UIImage *placeholderImage = [UIImage imageNamed:@"your_placeholder"]; 

__weak UITableViewCell *weakCell = cell; 

[cell.imageView setImageWithURLRequest:request 
         placeholderImage:placeholderImage 
           success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 

            weakCell.imageView.image = image; 
            [weakCell setNeedsLayout]; 

           } failure:nil]; 

Es funktioniert gut mit AFNetworking 2.

4

Ich habe bereits auf die ähnliche Frage here

Verwenden Sie die folgende Klasse beantwortet:

class ImageLoadingWithCache { 

    var imageCache = [String:UIImage]() 

    func getImage(url: String, imageView: UIImageView, defaultImage: String) { 
     if let img = imageCache[url] { 
      imageView.image = img 
     } else { 
      let request: NSURLRequest = NSURLRequest(URL: NSURL(string: url)!) 
      let mainQueue = NSOperationQueue.mainQueue() 

      NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler: { (response, data, error) -> Void in 
       if error == nil { 
        let image = UIImage(data: data) 
        self.imageCache[url] = image 

        dispatch_async(dispatch_get_main_queue(), { 
         imageView.image = image 
        }) 
       } 
       else { 
        imageView.image = UIImage(named: defaultImage) 
       } 
      }) 
     } 
    } 
} 

Verbrauch:

var cache = ImageLoadingWithCache() 
cache.getImage(YOUR_URL, imageView: YOUR_IMAGEVIEW, defaultImage: "DEFAULT_IMAGE_NAME") 
Verwandte Themen