2015-03-06 4 views
8

मैं छवि को देखने के लिए URL को लोड करने के लिए इस का उपयोग कर रहातेज़ तरीका छवि को देखने के लिए एक URL से छवि को लोड करने तालिका दृश्य कक्ष में

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

लेकिन जब वहाँ विभिन्न छवियों के साथ तालिका दृश्य कक्ष में 10 आइटम, स्क्रॉल है धीमी हो जाता है और लटका हुआ है

मैं 40 एक्स 40

के आकार के साथ छवियों को लोड मुझे आश्चर्य है कि यूआरएल छवियों को लोड करने के लिए एक बेहतर तरीका उपलब्ध है?

उत्तर

21

साथ ठीक काम करता है मैं SDWebImage उपयोग करने का सुझाव होगा।

यह स्थापित करने के बाद आप और स्विफ्ट के लिए एक ब्रिजिंग हैडर बनाने की आवश्यकता होगी इस लाइन में शामिल हैं:

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

: तो फिर तुम सब अपने cellForRowAtIndexPath समारोह में क्या करने की जरूरत यह है

#import "UIImageView+WebCache.h" 

इस पुस्तकालय के बारे में अच्छी बात यह है कि यह स्वचालित रूप से छवि को कैश करता है ताकि यह केवल एक बार डाउनलोड हो।

+0

स्विफ्ट के लिए एक ब्रिजिंग हैडर नहीं बना सकता, कैसे करने के लिए ?? –

+0

https: //bohemianpolymorph.wordpress।कॉम/2014/07/11/मैन्युअल-जोड़-ए-स्विफ्ट-ब्रिजिंग-हेडर/ – Sam

+0

बिल्कुल धन्यवाद –

5

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

यहाँ मेरी किताब से उदाहरण कोड है:

(।। पूर्ण काम कर उदाहरण here है और MyDownloader, self.downloader के वर्ग के लिए कोड here है)

अतिरिक्त सुपर दक्षता के लिए, यदि छवि आने से पहले उपयोगकर्ता पंक्ति से बाहर एक पंक्ति को स्क्रॉल करता है तो डाउनलोड को रद्द करें। इस तरह आप एक टोपी सेट करते हैं कि एक बार में कितने डाउनलोड हो सकते हैं। हालांकि यह ऑब्जेक्टिव-सी में है

+0

विशेष रूप से, एक कॉलबैक कि भरता साथ NSURLConnection.sendAsynchronousRequest' पर विचार ' छवि डेटा में। – BaseZen

0

एप्पल, एक नमूना कोड LazyTableImages है। जैसा कि @ मैट ने उल्लेख किया है, इसे अतुल्यकालिक रूप से किया जाना है।

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

यह AFNetworking 2.

4

मैं पहले से ही इसी तरह के सवाल here

निम्नलिखित वर्ग का उपयोग करने के लिए जवाब दे दिया है:

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) 
       } 
      }) 
     } 
    } 
} 

उपयोग:

var cache = ImageLoadingWithCache() 
cache.getImage(YOUR_URL, imageView: YOUR_IMAGEVIEW, defaultImage: "DEFAULT_IMAGE_NAME") 
संबंधित मुद्दे