সুইফটে ইউআরএল থেকে চিত্র লোড করা / ডাউনলোড করা হচ্ছে


412

আমি আমার অ্যাপ্লিকেশনটিতে একটি ইউআরএল থেকে একটি চিত্র লোড করতে চাই, তাই আমি প্রথমে অবজেক্টিভ-সি দিয়ে চেষ্টা করেছি এবং এটি সুইফটের সাহায্যে কাজ করেছে, আমার একটি সংকলন ত্রুটি রয়েছে:

'চিত্রবিহীন ডেটা' অনুপলব্ধ: অবজেক্ট কনস্ট্রাকশন ব্যবহার করুন 'ইউআইআইমেজ (ডেটা :)'

আমার ফাংশন:

@IBOutlet var imageView : UIImageView

override func viewDidLoad() {
    super.viewDidLoad()

    var url:NSURL = NSURL.URLWithString("http://myURL/ios8.png")
    var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil)

    imageView.image = UIImage.imageWithData(data)// Error here
}

উদ্দেশ্য-সি তে:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:(@"http://myURL/ios8.png")];
    NSData *data = [NSData dataWithContentsOfURL:url];

    _imageView.image = [UIImage imageWithData: data];
    _labelURL.text = @"http://www.quentinroussat.fr/assets/img/iOS%20icon's%20Style/ios8.png";
 }

কেউ দয়া করে আমাকে ব্যাখ্যা করতে পারেন কেন imageWithData:সুইফ্টের সাথে কাজ করে না এবং আমি কীভাবে সমস্যার সমাধান করতে পারি।


3
এটি চেষ্টা করুনimageURL.image = UIImage(data: myDataVar)
অ্যালেকারসন

এটা কাজ নিখুঁত! আপনাকে ধন্যবাদ তবে আমি কেন এই পদ্ধতিটি উদ্দেশ্য সি তে কাজ করে না, এবং
সুইফটে

আপনার যখন কোকো ক্লাস নিয়ে সমস্যা হয় তখন CMD + ক্লাসের নামটি ক্লিক করে দেখুন এবং ক্লাসের জন্য আপনি সুইফট ইন্টারফেসটি দেখতে সক্ষম হবেন!
আলেকারসন

3
যদি ইউআরএল = এনএসআরএল (স্ট্রিং: "ইমেজুরল") {যদি ডেটা = এনএসডিটা (বিষয়বস্তু: ইউআরএল) let চিত্রভিউ.আইমেজ = ইউআইআইমেজ (ডেটা: ডেটা)}}
হার্ডিক বার

2
@ লিও ডাবাস এই প্রশ্নটি সুইফট ২-এর সাথে নির্দিষ্ট নয়, দয়া করে এটি ট্যাগ যুক্ত করা বন্ধ করুন।
মিক ম্যাককালাম

উত্তর:


769

এক্সকোড 8 বা তারপরে • সুইফ্ট 3 বা তারপরে

সিঙ্ক্রোনাস:

if let filePath = Bundle.main.path(forResource: "imageName", ofType: "jpg"), let image = UIImage(contentsOfFile: filePath) {
    imageView.contentMode = .scaleAspectFit
    imageView.image = image
}

অ্যাসিঙ্ক্রোনাস:

আপনার ইউআরএল থেকে চিত্রের ডেটা পেতে একটি সমাপ্তি হ্যান্ডলার সহ একটি পদ্ধতি তৈরি করুন

func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
    URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
}

ছবিটি ডাউনলোড করার জন্য একটি পদ্ধতি তৈরি করুন (কাজ শুরু করুন)

func downloadImage(from url: URL) {
    print("Download Started")
    getData(from: url) { data, response, error in
        guard let data = data, error == nil else { return }
        print(response?.suggestedFilename ?? url.lastPathComponent)
        print("Download Finished")
        DispatchQueue.main.async() { [weak self] in
            self?.imageView.image = UIImage(data: data)
        }
    }
}

ব্যবহার:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    print("Begin of code")
    let url = URL(string: "https://cdn.arstechnica.net/wp-content/uploads/2018/06/macOS-Mojave-Dynamic-Wallpaper-transition.jpg")! 
    downloadImage(from: url)
    print("End of code. The image will continue downloading in the background and it will be loaded when it ends.")
}

সম্প্রসারণ :

extension UIImageView {
    func downloaded(from url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {  // for swift 4.2 syntax just use ===> mode: UIView.ContentMode
        contentMode = mode
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard
                let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
                else { return }
            DispatchQueue.main.async() { [weak self] in
                self?.image = image
            }
        }.resume()
    }
    func downloaded(from link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {  // for swift 4.2 syntax just use ===> mode: UIView.ContentMode
        guard let url = URL(string: link) else { return }
        downloaded(from: url, contentMode: mode)
    }
}

ব্যবহার:

imageView.downloaded(from: "https://cdn.arstechnica.net/wp-content/uploads/2018/06/macOS-Mojave-Dynamic-Wallpaper-transition.jpg")

13
এখানে কেবল একটি পার্শ্ব নোট, আপনার এটিতে কোনও যুক্ত বস্তু সেট করা উচিত; অন্যথায় আপনি একে অপরের উপরে চিত্রগুলি লোড করতে পারেন। উদাহরণস্বরূপ, UITableViewযেখানে কোনও ঘর একটি চিত্র দেখায় এবং শৃঙ্খলাবদ্ধ ঘরটি ফিরে এলে চিত্র আপডেট হয়। যদি প্রক্রিয়া # 1 আরও বেশি সময় নেয় তবে প্রক্রিয়া # 2, প্রক্রিয়া # 2 এর চিত্রটি প্রদর্শন করবে এবং পরে এটি প্রক্রিয়া # 1 দ্বারা আপডেট হবে যদিও চিত্রটি ব্যবহারকারীর পক্ষে আর বৈধ নয়।
পল পিলেন

1
এটি আমার সমস্যা সমাধান করেছে। আমি যখন টেবিল ভিউতে ইউআরএল দিয়ে চিত্র লোড করার চেষ্টা করি, উপরে বা নীচে স্ক্রোল করার সময় স্ক্রোল ভিউটি সত্যিই প্রতিক্রিয়া জানায় না। আমি ইউআইআইমেজভিউ এক্সটেনশন ব্যবহার করেছি এবং এটি আমার সমস্যার সমাধান করেছে। ধন্যবাদ।
জেংজি চাও

1
@ লিওডাবাস ঠিক আছে ধন্যবাদ এবং এতগুলি প্রশ্নের উত্তর দেওয়ার জন্য ধন্যবাদ! আপনি সুইফট এবং আইওএসের একজন অধ্যাপকের মতো। :)
ক্র্যাশলোট

2
@ লিওডাবাস কীভাবে আপনি ডাউনলোড টাস্কউইথ URL এর পরিবর্তে ডেটা টাস্কউইথ URL ব্যবহার করলেন?
ক্র্যাশলোট

3
দ্বিতীয়টি একটি ফাইলটিতে মেমোরির জন্য প্রথম ডাউনলোড করে
লিও ডাবাস

349

(সুইফ্ট 4 আপডেট) সরাসরি আসল প্রশ্নের উত্তর দিতে, এখানে পোস্ট করা উদ্দেশ্য-সি স্নিপেটের সুইফ্ট সমতুল্য।

let url = URL(string: image.url)
let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
imageView.image = UIImage(data: data!)

দাবিপরিত্যাগ:

এটি লক্ষ করা গুরুত্বপূর্ণ যে Data(contentsOf:)পদ্ধতিটি একইভাবে থ্রেডে ইউআরএলটির বিষয়বস্তু সিঙ্ক্রোনালি ডাউনলোড করবে কোডটি কার্যকর করা হচ্ছে, সুতরাং এটি আপনার অ্যাপ্লিকেশনের মূল থ্রেডে অনুরোধ করবেন না

একই কোডটি অযৌক্তিকভাবে চালিত করার সহজ উপায়, ইউআই অবরুদ্ধ না করে, জিসিডি ব্যবহার করে:

let url = URL(string: image.url)

DispatchQueue.global().async {
    let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
    DispatchQueue.main.async {
        imageView.image = UIImage(data: data!)
    }
}

এটি বলেছে, বাস্তব জীবনের অ্যাপ্লিকেশনগুলিতে, আপনি যদি সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতা পেতে চান এবং একই চিত্রের একাধিক ডাউনলোড এড়াতে চান তবে আপনি সেগুলি কেবল ডাউনলোড না করেই ক্যাশে রাখতে চাইতে পারেন। ইতিমধ্যে বেশ কয়েকটি লাইব্রেরি রয়েছে যা খুব বিরামবিহীন করে এবং সেগুলি ব্যবহারের জন্য সত্যই সহজ। আমি ব্যক্তিগতভাবে কিংফিশারকে সুপারিশ করি :

import Kingfisher

let url = URL(string: "url_of_your_image")
// this downloads the image asynchronously if it's not cached yet
imageView.kf.setImage(with: url) 

এবং এটাই


12
"সহজেই" বিষয়ভিত্তিক, এবং নবীন কোডাররা এই অযাচিত আচরণের প্রত্যাশা করবে না, তবে এই স্নিপডকে যেমন আছে তেমনভাবে অনুলিপি / আটকান। সম্ভবত আপনি আপনার উত্তর আপডেট করতে পারেন?
অরলিন জর্জিভ

13
আমি এখনও একমত না। কিছু উত্তর সহজ রাখা উচিত, এখানে আসা প্রচুর লোক কোডের ছোট ছোট স্নিপেটগুলি অনুলিপি করতে এবং পেস্ট করতে পছন্দ করে। আমি কেবল আসল প্রশ্নটি থেকে উদ্দেশ্য-সি কোডটি স্যুইফটে অনুবাদ করেছি, এর বাইরে সমস্ত কিছুই বোনাস। এবং যাইহোক, ইতিমধ্যে এই একই প্রশ্নে একটি উত্তর রয়েছে এই ধরণের বোনাস তথ্য সরবরাহ করে, যা তথ্য নকল করতে কম বোঝায়।
লুকাস এডুয়ার্ডো

1
@ ব্যবহারকারী কেবল যে image.urlকোনও স্ট্রিং ইউআরএল, হার্ডকোডযুক্ত বা না দ্বারা প্রতিস্থাপন করুন :)
এডুয়ার্ডো

1
@ ইয়ানবারবার্টন অবশ্যই আপনি যা যা ব্যবহার করতে পারেন :) 1) এই উত্তরটি মূল প্রশ্নের উপর ভিত্তি করে তৈরি করা হয়েছে, যা উদ্দেশ্য-সিতে একই পদ্ধতি ব্যবহার করছিল, তাই আমি কেবল "অনুবাদ" দ্রুত করতে সহায়তা করেছি। ২) এই পদ্ধতির অপসারণ করা এবং এটি যুক্তিযুক্ত করার কোনও অর্থ নেই URLSession.dataTaskকারণ এখানে প্রচুর অন্যান্য উত্তর ইতিমধ্যে এটি কীভাবে করবেন তা দেখায়, বিভিন্ন বিকল্পগুলি খোলা রাখা আরও ভাল।
লুকাস এডুয়ার্ডো

2
হেয়ো, প্রস্তাবিত কাঠামো, কিংফিশার, উত্তরে বর্ণিত হিসাবে ভারী উত্তোলনের সমস্ত কাজ করবে। পরামর্শের জন্য ধন্যবাদ!
কিলমজিং

68

যদি আপনি কেবল চিত্রটি লোড করতে চান (অ্যাসিনক্রোনাসলি!) - কেবল আপনার সুইফ্ট কোডটিতে এই ছোট এক্সটেনশনটি যুক্ত করুন:

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        if let url = NSURL(string: urlString) {
            let request = NSURLRequest(URL: url)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
                (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
                if let imageData = data as NSData? {
                    self.image = UIImage(data: imageData)
                }
            }
        }
    }
}

এবং এটি এইভাবে ব্যবহার করুন:

myImageView.imageFromUrl("https://robohash.org/123.png")

1
এটি প্রদর্শিত হচ্ছে না, এবং আমি মনে করি কারণ এখানে জিসিডি প্রয়োজন। আমি কীভাবে রিফ্রেশ করব?
jo3birdtalk

@ jo3birdtalk এটি জিসিডির সমস্যা নয়। দৃশ্যের সাথে আপনার বাইন্ডিংগুলি পরীক্ষা করুন।
স্কাইওয়ান্দের

6
এনএসআরএলস কানেকশনটি আইওএস 9 এবং আরও অনেক ক্ষেত্রে অবমূল্যায়িত হয়েছে। এনএসআরএলসেশন আন্তঃ ব্যবহার করুন।
মুহস্তুর্ক

2
আইওএস 9
ক্র্যাশলোট

ধন্যবাদ স্কাইওয়েন্ডার, আমি অ্যারে থেকে চিত্রগুলি ডাউনলোড করার জন্য এই পদ্ধতিটি ব্যবহার করছি। আমি চাই যখন ব্যবহারকারী cancelবোতামে টিপুন এটি ডাউনলোড করা বন্ধ করে দেয়। এই পদ্ধতিটি ব্যবহার করে আমি কীভাবে এটি করতে পারি তা সম্পর্কে আপনার কোনও ধারণা আছে? আমাকে বাতিল কার্যকারিতা যুক্ত করতে হবে।
ZAFAR007

44

সুইফট ২.২ || এক্সকোড 7.3

আমি আশ্চর্যজনক ফলাফল পেয়েছি !! সঙ্গে AlamofireImage দ্রুতগতি গ্রন্থাগার

এটি একাধিক বৈশিষ্ট্য সরবরাহ করে:

  • অ্যাসিঙ্ক্রোনাসলি ডাউনলোড করুন
  • অ্যাপ্লিকেশনের জন্য মেমরির সতর্কতাগুলি ঘটলে অটো Purging ইমেজ ক্যাশে
  • চিত্র ইউআরএল ক্যাচিং
  • চিত্র ক্যাচিং
  • সদৃশ ডাউনলোডগুলি এড়িয়ে চলুন

এবং আপনার অ্যাপ্লিকেশনটির জন্য প্রয়োগ করা খুব সহজ

পদক্ষেপ 1 শুঁটি ইনস্টল করুন


অ্যালামোফায়ার 3.3.x

পোড 'অ্যালামোফায়ার'

অ্যালামোফায়ার ইমেজ ২.৪.x

পোড 'অ্যালামোফায়ার ইমেজ'

পদক্ষেপ 2 আমদানি এবং ব্যবহার করুন

import Alamofire
import AlamofireImage

let downloadURL = NSURL(string: "http://cdn.sstatic.net/Sites/stackoverflow/company/Img/photos/big/6.jpg?v=f4b7c5fee820")!
imageView.af_setImageWithURL(downloadURL)

এটাই!! এটি সবকিছু যত্ন নেবে


গ্রেট ধন্যবাদ Alamofire বলছি , সহজ iDevelopers জীবন তৈরীর জন্য;)


8
সুইফট 3: পূর্বভূমিআইজেজ.এফ_সেট ইমেজ (ইউআরএল হিসাবে ইউআরএল: ডাউনলোড ইউআরএল)
thejuki

28

এক্সকোড 8সুইফট 3

লিও ডাবসের উত্তর দুর্দান্ত! আমি কেবল একটি সর্ব-ইন-ওয়ান ফাংশন সমাধান সরবরাহ করতে চেয়েছিলাম:

let url = URL(string: 
    "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png")

let task = URLSession.shared.dataTask(with: url!) { data, response, error in
    guard let data = data, error == nil else { return }

    DispatchQueue.main.async() {    // execute on main thread
        self.imageView.image = UIImage(data: data)
    }
}

task.resume()

3
চিহ্নিত, সম্ভবত সেখানে "async" বোঝানো হয়েছে
ফ্যাটি

16

আমি প্রশ্নের সর্বোত্তম উত্তরের কোডটি একটি একক, পুনরায় ব্যবহারযোগ্য শ্রেণীর মধ্যে প্রসারিত ইউআইআইমেজভিউতে আবৃত করে রেখেছি, যাতে আপনি সরাসরি আপনার স্টোরিবোর্ডে অ্যাসিঙ্ক্রোনাস লোডিং ইউআইআইমেজভিউগুলি ব্যবহার করতে পারেন (বা কোড থেকে সেগুলি তৈরি করতে পারেন)।

এখানে আমার ক্লাস:

import Foundation
import UIKit

class UIImageViewAsync :UIImageView
{

    override init()
    {
        super.init(frame: CGRect())
    }

    override init(frame:CGRect)
    {
        super.init(frame:frame)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func getDataFromUrl(url:String, completion: ((data: NSData?) -> Void)) {
        NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) { (data, response, error) in
            completion(data: NSData(data: data))
        }.resume()
    }

    func downloadImage(url:String){
        getDataFromUrl(url) { data in
            dispatch_async(dispatch_get_main_queue()) {
                self.contentMode = UIViewContentMode.ScaleAspectFill
                self.image = UIImage(data: data!)
            }
        }
    }
}

এবং এটি কীভাবে ব্যবহার করবেন তা এখানে:

imageView.downloadImage("http://www.image-server.com/myImage.jpg")

2
আমাদের কি সত্যিই সেই ওভাররাইড ইনসাইটগুলি দরকার? Inits কি যাইহোক উত্তরাধিকারসূত্রে হয় না? দেখে মনে হচ্ছে আমরা কেবল নিজের উপর সুপার বলার জন্য এখানে কেবল ওভাররাইড করছি যা আমাকে অপ্রয়োজনীয় হিসাবে আঘাত করে।
এনওয়াইসি টেক ইঞ্জিনিয়ার

16

সুইফট 4 :

এটি চিত্রটি লোড করার সময় লোডার দেখায়। আপনি এনএসচে ব্যবহার করতে পারেন যা অস্থায়ীভাবে চিত্র সঞ্চয় করে

let imageCache = NSCache<NSString, UIImage>()
extension UIImageView {
    func loadImageUsingCache(withUrl urlString : String) {
        let url = URL(string: urlString)
        if url == nil {return}
        self.image = nil

        // check cached image
        if let cachedImage = imageCache.object(forKey: urlString as NSString)  {
            self.image = cachedImage
            return
        }

        let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .gray)
        addSubview(activityIndicator)
        activityIndicator.startAnimating()
        activityIndicator.center = self.center

        // if not, download image from url
        URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
            if error != nil {
                print(error!)
                return
            }

            DispatchQueue.main.async {
                if let image = UIImage(data: data!) {
                    imageCache.setObject(image, forKey: urlString as NSString)
                    self.image = image
                    activityIndicator.removeFromSuperview()
                }
            }

        }).resume()
    }
}

ব্যবহার: -

truckImageView.loadImageUsingCache(withUrl: currentTruck.logoString)

1
এটা কাজ করে। কেবল ত্রুটি ক্ষেত্রে ক্রিয়াকলাপতন্ত্রক অপসারণ অনুলিপি করুন।
djdance

1
আমার প্রকল্পের জন্য খুব দরকারী।
partikles

13
let url = NSURL.URLWithString("http://live-wallpaper.net/iphone/img/app/i/p/iphone-4s-wallpapers-mobile-backgrounds-dark_2466f886de3472ef1fa968033f1da3e1_raw_1087fae1932cec8837695934b7eb1250_raw.jpg");
var err: NSError?
var imageData :NSData = NSData.dataWithContentsOfURL(url,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
var bgImage = UIImage(data:imageData)

5
fatal error: unexpectedly found nil while unwrapping an Optional value
ব্যবহারকারী

কোন সুযোগ আপনি অ্যাসিঙ্ক্রোনাস কিছু লিখতে পারেন?
জেদ গ্রান্ট

@JedGrant আপনি dispatch_async ব্যবহার অন্য থ্রেড এবং একটি কলব্যাক ঢোকা পারে
Matej

আমাকে একটি "এনএসডিটা" মুছে ফেলতে হয়েছিল! (শেষের দিকে নোট করুন!) এটির মতো এটির কাজ করার জন্য: var চিত্রডেটা: এনএসডাটা = এনএসডিটা (বিষয়বস্তু অফার: ইউআরএল, বিকল্পগুলি: এনএসডিটাআরএডিংঅ্যাপশনস।ডাটা রিডারিংম্যাপডআইফস্যাফ, ত্রুটি: & ত্রুটি)!
বটবট

13

এফওয়াইআই: সুইফট -২.০ এক্সকোড .0.০ বিটা ২-এর জন্য

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        if let url = NSURL(string: urlString) {
            let request = NSURLRequest(URL: url)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
            (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
                self.image = UIImage(data: data!)
            }
        }
    }
}

5
এনএসআরএল সংযোগটি ছাড়ানো হয়েছে। আপনাকে এনএসআরএলসেশন ব্যবহার করতে হবে। আপনি সুইফট ২.০ এবং
এক্সকোড

10

ত্রুটি পরিচালনার সাথে সুইফট 3

let url = URL(string: arr[indexPath.row] as! String)
if url != nil {
    DispatchQueue.global().async {
        let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
        DispatchQueue.main.async {
            if data != nil {
                cell.imgView.image = UIImage(data:data!)
            }else{
                cell.imgView.image = UIImage(named: "default.png")
            }
        }
    }
}

এক্সটেনশন সহ

extension UIImageView {

    func setCustomImage(_ imgURLString: String?) {
        guard let imageURLString = imgURLString else {
            self.image = UIImage(named: "default.png")
            return
        }
        DispatchQueue.global().async { [weak self] in
            let data = try? Data(contentsOf: URL(string: imageURLString)!)
            DispatchQueue.main.async {
                self?.image = data != nil ? UIImage(data: data!) : UIImage(named: "default.png")
            }
        }
    }
}

এক্সটেনশন ব্যবহার

myImageView. setCustomImage("url")

ক্যাশে সমর্থন সহ

let imageCache = NSCache<NSString, UIImage>()

extension UIImageView {

    func loadImageUsingCacheWithURLString(_ URLString: String, placeHolder: UIImage?) {

        self.image = nil
        if let cachedImage = imageCache.object(forKey: NSString(string: URLString)) {
            self.image = cachedImage
            return
        }

        if let url = URL(string: URLString) {
            URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in

                //print("RESPONSE FROM API: \(response)")
                if error != nil {
                    print("ERROR LOADING IMAGES FROM URL: \(String(describing: error))")
                    DispatchQueue.main.async { [weak self] in
                        self?.image = placeHolder
                    }
                    return
                }
                DispatchQueue.main.async { [weak self] in
                    if let data = data {
                        if let downloadedImage = UIImage(data: data) {
                            imageCache.setObject(downloadedImage, forKey: NSString(string: URLString))
                            self?.image = downloadedImage
                        }
                    }
                }
            }).resume()
        }
    }
}

9

সুইফট 4: ছোট চিত্রগুলির জন্য একটি সাধারণ লোডার (উদা: থাম্বনেইলস) যা এনএসকেচে ব্যবহার করে এবং সর্বদা মূল থ্রেডে চালিত হয়:

class ImageLoader {

  private static let cache = NSCache<NSString, NSData>()

  class func image(for url: URL, completionHandler: @escaping(_ image: UIImage?) -> ()) {

    DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async {

      if let data = self.cache.object(forKey: url.absoluteString as NSString) {
        DispatchQueue.main.async { completionHandler(UIImage(data: data as Data)) }
        return
      }

      guard let data = NSData(contentsOf: url) else {
        DispatchQueue.main.async { completionHandler(nil) }
        return
      }

      self.cache.setObject(data, forKey: url.absoluteString as NSString)
      DispatchQueue.main.async { completionHandler(UIImage(data: data as Data)) }
    }
  }

}

ব্যবহার:

ImageLoader.image(for: imageURL) { image in
  self.imageView.image = image
}

স্ট্রাক্ট সহ সিঙ্গলটন কেন ব্যবহার করবেন? এটি আপনার ক্লাসকে অচল করে দেবে যা আপনার এনএসকেচে সমস্যা তৈরি করতে পারে
এক্সকোডনুব

এটি নির্দেশ করার জন্য ধন্যবাদ, আমি কেবল এটিকে পরিবর্তন করেছি class
ফেথিকা

1
প্রাইভেট লেট ক্যাশে আমাকে ত্রুটি দিচ্ছিল তাই এটি এটিকে স্ট্যাটিকের পরিবর্তিত করে এবং এটি কাজ করে! ধন্যবাদ
হামাদ তারিক

7

আপনি করতে চাইবেন:

UIImage(data: data)

সুইফটে, তারা বেশিরভাগ অবজেক্টিভ সি কারখানার পদ্ধতিগুলিকে নিয়মিত কনস্ট্রাক্টর দিয়ে প্রতিস্থাপন করেছে।

দেখা:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26


2
প্রযুক্তিগতভাবে ম্যাপ করা হয়েছে, প্রতিস্থাপন করা হয়নি। আপনি যদি নিজের পদ্ধতি তৈরি করেন তবে আপনি +(instancetype)[MyThing thingWithOtherThing:]এটিকে MyThing(otherThing: ...)সুইফ্ট হিসাবেও কল করবেন ।
ব্রায়ান নিকেল

7

ত্রুটি হ্যান্ডেল এবং কাস্টম অনুরোধ শিরোনাম সহ সুইফট 2

কেবল ইউআইআইমেজভিউতে এক্সটেনশন যুক্ত করুন:

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        if let url = NSURL(string: urlString) {
            let request = NSMutableURLRequest(URL: url)
            request.setValue("<YOUR_HEADER_VALUE>", forHTTPHeaderField: "<YOUR_HEADER_KEY>")
            NSURLSession.sharedSession().dataTaskWithRequest(request) {
                (data, response, error) in
                guard let data = data where error == nil else{
                    NSLog("Image download error: \(error)")
                    return
                }

                if let httpResponse = response as? NSHTTPURLResponse{
                    if httpResponse.statusCode > 400 {
                        let errorMsg = NSString(data: data, encoding: NSUTF8StringEncoding)
                        NSLog("Image download error, statusCode: \(httpResponse.statusCode), error: \(errorMsg!)")
                        return
                    }
                }

            dispatch_async(dispatch_get_main_queue(), {
                NSLog("Image download success")
                self.image = UIImage(data: data)
            })
            }.resume()
        }
    }
}

এবং তারপরে, imageFromUrl(urlString: String)চিত্রটি ডাউনলোড করতে নতুন ব্যবহার করুন

ব্যবহার:

imageView.imageFromUrl("https://i.imgur.com/ONaprQV.png")

দ্রুত 3 এ, আমি এই ত্রুটিটি পেতে থাকি। সমস্যা কি ? এই লাইনে "" "ইউআরএলসেশন.সারেড.ডাটাটাস্ক (সাথে: ইউআরএল) {" "" "" "টাইপের একটি আর্গুমেন্ট তালিকা (': ইউআরএল, (ডেটা?, ইউআরএল রিস্পনস ?, ত্রুটি? ) -> অকার্যকর) '
আয়মান ব্রোমধনে

7

সুইফট 4

এই পদ্ধতিটি একটি ওয়েবসাইট থেকে একটি চিত্র তাত্পর্যপূর্ণভাবে ডাউনলোড করবে এবং এটি ক্যাশে করবে:

    func getImageFromWeb(_ urlString: String, closure: @escaping (UIImage?) -> ()) {
        guard let url = URL(string: urlString) else {
return closure(nil)
        }
        let task = URLSession(configuration: .default).dataTask(with: url) { (data, response, error) in
            guard error == nil else {
                print("error: \(String(describing: error))")
                return closure(nil)
            }
            guard response != nil else {
                print("no response")
                return closure(nil)
            }
            guard data != nil else {
                print("no data")
                return closure(nil)
            }
            DispatchQueue.main.async {
                closure(UIImage(data: data!))
            }
        }; task.resume()
    }

ব্যাবহৃত হচ্ছে:

    getImageFromWeb("http://www.apple.com/euro/ios/ios8/a/generic/images/og.png") { (image) in
        if let image = image {
            let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
            imageView.image = image
            self.view.addSubview(imageView)
        } // if you use an Else statement, it will be in background
    }

কেমন চলছে ক্যাচিং? আর কতক্ষণ?
রামিস

এটি স্থায়ীভাবে সঞ্চিত বলে মনে হচ্ছে, যা অদ্ভুত, এটি লাইব্রেরি> ক্যাশে ফোল্ডারে সঞ্চিত রয়েছে। সিমুলেটারে চালানোর সময় আপনার কম্পিউটারে এই অবস্থানটি পেতে প্রিন্ট (এনএসহোমডাইরেক্টরি ()) ব্যবহার করুন।
ববি

5

সুইফট ২.০:

1)

if let url = NSURL(string: "http://etc...") {
    if let data = NSData(contentsOfURL: url) {
        imageURL.image = UIImage(data: data)
    }        
}

অথবা

imageURL.image =
    NSURL(string: "http:// image name...")
    .flatMap { NSData(contentsOfURL: $0) }
    .flatMap { UIImage(data: $0) }

2) ভিসি বা এক্সটেনশনে এই পদ্ধতিটি যুক্ত করুন।

func load_image(urlString:String)
{   let imgURL: NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse?, data: NSData?, error: NSError?) in

        if error == nil {
            self.image_element.image = UIImage(data: data)
        }
    }
}

ব্যবহার:

self.load_image(" url strig here")

আইওএস 9
ক্র্যাশলোট

5

ইউআরএল-এ লোড চিত্রের জন্য কিংফিশার অন্যতম সেরা গ্রন্থাগার।

গিথুব ইউআরএল - https://github.com/onevcat/ কিংফিশার

// If you want to use Activity Indicator.
imageview_pic.kf.indicatorType = .activity
imageview_pic.kf.setImage(with: URL(string: "Give your url string"))

// If you want to use custom placeholder image.
imageview_pic.kf.setImage(with: URL(string: "Give your url string"), placeholder: UIImage(named: "placeholder image name"), options: nil, progressBlock: nil, completionHandler: nil)

5

ইউআরএল থেকে চিত্র লোডিং / ডাউনলোড করার জন্য এখানে ওয়ার্কিং কোড রয়েছে। ডাউনলোড এবং লোড আসল চিত্রের আগে NSCache স্বয়ংক্রিয়ভাবে এবং স্থানধারক চিত্র প্রদর্শন করুন (সুইফট 4 কোড)।

func NKPlaceholderImage(image:UIImage?, imageView:UIImageView?,imgUrl:String,compate:@escaping (UIImage?) -> Void){

    if image != nil && imageView != nil {
        imageView!.image = image!
    }

    var urlcatch = imgUrl.replacingOccurrences(of: "/", with: "#")
    let documentpath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    urlcatch = documentpath + "/" + "\(urlcatch)"

    let image = UIImage(contentsOfFile:urlcatch)
    if image != nil && imageView != nil
    {
        imageView!.image = image!
        compate(image)

    }else{

        if let url = URL(string: imgUrl){

            DispatchQueue.global(qos: .background).async {
                () -> Void in
                let imgdata = NSData(contentsOf: url)
                DispatchQueue.main.async {
                    () -> Void in
                    imgdata?.write(toFile: urlcatch, atomically: true)
                    let image = UIImage(contentsOfFile:urlcatch)
                    compate(image)
                    if image != nil  {
                        if imageView != nil  {
                            imageView!.image = image!
                        }
                    }
                }
            }
        }
    }
}

এটির মতো ব্যবহার করুন:

// Here imgPicture = your imageView
// UIImage(named: "placeholder") is Display image brfore download and load actual image. 

NKPlaceholderImage(image: UIImage(named: "placeholder"), imageView: imgPicture, imgUrl: "Put Here your server image Url Sting") { (image) in }

1
একমাত্র আমার সাথে কাজ করেছে। আমার সমস্যাটি ছিল আমি সঙ্গীত প্লেয়ার বাস্তবায়ন করছিলাম এবং ফোনটি বন্ধ হয়ে যাওয়ার পরে আমি চিত্রটি নোটিফিকেশনে লোড করতে চাইতাম এবং হ্যান্ডলারটি ইউআইআইমেজ টাইপ নেয় তাই আমাকে এই পদ্ধতিটি ব্যবহার করতে হয়েছিল।
JhonnyTawk

4

ছবিটি নিরাপদ থাকার এবং সুইফট ২.০ এবং এক্স-কোড 7.1 এর সাথে কাজ করার জন্য একটি পদ্ধতি:

static func imageForImageURLString(imageURLString: String, completion: (image: UIImage?, success: Bool) -> Void) {
    guard let url = NSURL(string: imageURLString),
        let data = NSData(contentsOfURL: url),
        let image = UIImage(data: data)
        else { 
            completion(image: nil, success: false); 
            return 
       }

    completion(image: image, success: true)
}

তারপরে আপনি এই পদ্ধতিটিকে এভাবে কল করবেন:

imageForImageURLString(imageString) { (image, success) -> Void in
        if success {
            guard let image = image 
                 else { return } // Error handling here 
            // You now have the image. 
         } else {
            // Error handling here.
        }
    }

আপনি যদি চিত্রটির সাথে ভিউটি আপডেট করে থাকেন তবে আপনাকে "যদি সাফল্য {" পরে এটি ব্যবহার করতে হবে:

    dispatch_async(dispatch_get_main_queue()) { () -> Void in
         guard let image = image 
              else { return } // Error handling here 
         // You now have the image. Use the image to update the view or anything UI related here
         // Reload the view, so the image appears
    }

আপনি যদি ইউআইতে চিত্রটি ব্যবহার করেন তবে এই শেষ অংশটি প্রয়োজন কারণ হ'ল নেটওয়ার্ক কলগুলি সময় নেয়। যদি আপনি উপরের মতো প্রেরণ_অ্যাসেন্সিকে কল না করে চিত্রটি ব্যবহার করে ইউআই আপডেট করার চেষ্টা করেন, চিত্রটি এখনও আনার সময় কম্পিউটারটি চিত্রটি সন্ধান করবে, কোনও চিত্র নেই (এখনও) খুঁজে পাবেন এবং কোনও চিত্র নেই বলে এগিয়ে চলুন পাওয়া যায় নি। আপনার কোডটিকে প্রেরণ_কেন্দ্রিক সমাপ্তির সমাপ্তির ভিতরে রেখে কম্পিউটারে বলে, "যাও, এই চিত্রটি নিয়ে এসো এবং আপনার কাজ শেষ হয়ে গেলে, এই কোডটি সম্পূর্ণ করুন।" এইভাবে কোডটি কল করার সময় আপনার চিত্রটি থাকবে এবং জিনিসগুলি ভালভাবে কাজ করবে।


4

আপনি যদি খুব খুব সাধারণ বাস্তবায়ন সন্ধান করেন। (এটি সুইফট 2 এ আমার জন্য কাজ করেছিল)

 let imageURL = NSURL(string: "https://farm2.staticflickr.com/1591/26078338233_d1466b7da2_m.jpg")
 let imagedData = NSData(contentsOfURL: imageURL!)!
 imageView?.image = UIImage(data: imagedData)

আমি একটি কাস্টম সেল সহ একটি টেবিলভিউয়ের মধ্যে প্রয়োগ করেছি যাতে কেবল একটি চিত্র থাকে

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

        let cell = tableView.dequeueReusableCellWithIdentifier("theCell", forIndexPath: indexPath) as! customTableViewCell

        let imageURL = NSURL(string: "https://farm2.staticflickr.com/1591/26078338233_d1466b7da2_m.jpg")

        let imagedData = NSData(contentsOfURL: imageURL!)!

        cell.imageView?.image = UIImage(data: imagedData)

        return cell

    }

আপনি ঠিকই বলেছেন, মূল থ্রেডে ডাউনলোড এবং সংকোচনের ঘটনা ঘটছে। আপনার আদর্শভাবে এই 2 টি পদক্ষেপটি পটভূমির থ্রেডে
অবিচ্ছিন্নভাবে করা

হ্যাঁ, ব্যাকগ্রাউন্ড থ্রেড ব্যবহার করে আমরা ডাউনলোডের গতি অনুকূল করতে পারি এবং প্রয়োজনে আমরা এর পরিবর্তে যুক্তিটি পরিবর্তন করতে পারি আমরা sdWebImage বা অন্যান্য কাঠামো ব্যবহার করতে পারি।
গৌরব যোশি

2

আমি কিংফিশার লাইব্রেরিটি অ্যাসিক্রোনারোগুলি চিত্র ডাউনলোড করতে ব্যবহার করার পরামর্শ দিই। কিংফিশার ব্যবহারের সর্বোত্তম অংশটি হ'ল এটি ডাউনলোডকৃত সমস্ত চিত্রকে ডিফল্টরূপে আইডি হিসাবে চিত্র url সহ ক্যাশে করে c পরের বার যখন আপনি সেই নির্দিষ্ট ইউআরএল দিয়ে চিত্র ডাউনলোড করার অনুরোধ করবেন, এটি এটি ক্যাশে থেকে লোড করবে।

ব্যবহার:

newsImage.kf.setImage(with: imageUrl!, placeholder: nil, options: nil, progressBlock: nil, completionHandler: { (image, error, cacheType, imageUrl) in
                if error == nil{
                    self.activityIndicator.stopAnimating()
                }else if error != nil{
                    self.activityIndicator.stopAnimating()
                }
            })

2

আপনি SDWebImageএকই অর্জন করতে শুঁটি ব্যবহার করতে পারেন । এটি ব্যবহার করা সহজ। আপনি এসডিওয়েবআইমেজ এখানে নথিপত্র পেতে পারেন get

এখানে নমুনা কোড

self.yourImage.sd_setImage(with: NSURL(string: StrUrl as String ) as URL!, placeholderImage: placeholderImage, options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
                if( error != nil)
                {
                    print("Error while displaying image" , (error?.localizedDescription)! as String)
                }
            })

1

সেখানে কেবল জিনিসগুলি অনুপস্থিত একটি!

let url = NSURL.URLWithString("http://live-wallpaper.net/iphone/img/app/i/p/iphone-4s-wallpapers-mobile-backgrounds-dark_2466f886de3472ef1fa968033f1da3e1_raw_1087fae1932cec8837695934b7eb1250_raw.jpg");
var err: NSError?
var imageData :NSData = NSData.dataWithContentsOfURL(url!,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
var bgImage = UIImage(data:imageData!)

দেরিতে জবাবের জন্য দুঃখিত, আপনি কী ত্রুটিগুলি পেয়েছেন তার উপর আপনি আরও সুনির্দিষ্ট হতে পারেন?
সাইমন জেনসেন

1

সুইফট ২.০ এর উত্তর যা ফাইলটি চিত্র ডাউনলোড করে (লিও ডাবাসের উত্তরের বিপরীতে, যা চিত্রটি স্মৃতিতে সঞ্চয় করে)। লিও ডাবাসের উত্তর এবং রব এর উত্তরের উপর ভিত্তি করে এনএসআরএলসেশন ডাউনলোড টাস্কউইথ উইকেট থেকে ডেটা পান সমাপ্তি হ্যান্ডলার থেকে :

    // Set download vars
    let downloadURL = NSURL() // URL to download from
    let localFilename = "foobar.png" // Filename for storing locally 

    // Create download request
    let task = NSURLSession.sharedSession().downloadTaskWithURL(downloadURL) { location, response, error in
        guard location != nil && error == nil else {
            print("Error downloading message: \(error)")
            return
        }

        // If here, no errors so save message to permanent location
        let fileManager = NSFileManager.defaultManager()
        do {
            let documents = try fileManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
            let fileURL = documents.URLByAppendingPathComponent(localFilename)
            try fileManager.moveItemAtURL(location!, toURL: fileURL)
            self.doFileDownloaded(fileURL, localFilename: localFilename)
            print("Downloaded message @ \(localFilename)")
        } catch {
            print("Error downloading message: \(error)")
        }
    }

    // Start download
    print("Starting download @ \(downloadURL)")
    task.resume()


// Helper function called after file successfully downloaded
private func doFileDownloaded(fileURL: NSURL, localFilename: String) {

    // Do stuff with downloaded image

}

1

সুইফট ৪.১ আমি একটি ফাংশন ক্র্যাটেড করেছি কেবল চিত্র ইউআরএল পাস করি, চিত্র তৈরি হওয়ার পরে ক্যাশে কী এটিকে সমাপ্তি ব্লকে সেট করে।

   class NetworkManager: NSObject {

  private var imageQueue = OperationQueue()
  private var imageCache = NSCache<AnyObject, AnyObject>()

  func downloadImageWithUrl(imageUrl: String, cacheKey: String, completionBlock: @escaping (_ image: UIImage?)-> Void) {

    let downloadedImage = imageCache.object(forKey: cacheKey as AnyObject)
    if let  _ = downloadedImage as? UIImage {
      completionBlock(downloadedImage as? UIImage)
    } else {
      let blockOperation = BlockOperation()
      blockOperation.addExecutionBlock({
        let url = URL(string: imageUrl)
        do {
          let data = try Data(contentsOf: url!)
          let newImage = UIImage(data: data)
          if newImage != nil {
            self.imageCache.setObject(newImage!, forKey: cacheKey as AnyObject)
            self.runOnMainThread {
              completionBlock(newImage)
            }
          } else {
            completionBlock(nil)
          }
        } catch {
          completionBlock(nil)
        }
      })
      self.imageQueue.addOperation(blockOperation)
      blockOperation.completionBlock = {
        print("Image downloaded \(cacheKey)")
      }
    }
  }
}
extension NetworkManager {
  fileprivate func runOnMainThread(block:@escaping ()->Void) {
    if Thread.isMainThread {
      block()
    } else {
      let mainQueue = OperationQueue.main
      mainQueue.addOperation({
        block()
      })
    }
  }
}

1
class func downloadImageFromUrl(with urlStr: String, andCompletionHandler:@escaping (_ result:Bool) -> Void) {
        guard let url = URL(string: urlStr) else {
            andCompletionHandler(false)
            return
        }
        DispatchQueue.global(qos: .background).async {
            URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) -> Void in
                if error == nil {
                    let httpURLResponse = response as? HTTPURLResponse
                    Utils.print( "status code ID : \(String(describing: httpURLResponse?.statusCode))")
                    if httpURLResponse?.statusCode == 200 {
                        if let data = data {
                            if let image = UIImage(data: data) {
                                ImageCaching.sharedInterface().setImage(image, withID: url.absoluteString as NSString)
                                DispatchQueue.main.async {
                                    andCompletionHandler(true)
                                }
                            }else {
                                andCompletionHandler(false)
                            }
                        }else {
                            andCompletionHandler(false)
                        }
                    }else {
                        andCompletionHandler(false)
                    }
                }else {
                    andCompletionHandler(false)
                }
            }).resume()
        }
    }

আমি আমার একটি সহজ বর্গ ফাংশন তৈরি করেছেন Utils.swiftযে পদ্ধতি আপনি কেবল দ্বারা অ্যাক্সেস করতে পারেন কলিং জন্য বর্গ classname.methodnameএবং আপনার চিত্র ব্যবহার NSCache সংরক্ষিত হয় ImageCaching.swiftবর্গ

Utils.downloadImageFromUrl(with: URL, andCompletionHandler: { (isDownloaded) in
                            if isDownloaded {
                                if  let image = ImageCaching.sharedInterface().getImage(URL as NSString) {
                                    self.btnTeam.setBackgroundImage(image, for: .normal)
                                }
                            }else {
                                DispatchQueue.main.async {
                                    self.btnTeam.setBackgroundImage(#imageLiteral(resourceName: "com"), for: .normal)
                                }
                            }
                        })

শুভ কোডিং। চিয়ার্স :)


1

সুইফট 4.2 এবং অ্যালামোফায়ার ইমেজ

লাইব্রেরি ব্যবহার করা যদি সমস্যা না হয় তবে আপনি এটির সাহায্যে এটি করতে পারেন AlamofireImage। আমার নমুনাগুলি এটির গিথুব থেকে

স্থানধারক চিত্রগুলির উদাহরণ:

let imageView = UIImageView(frame: frame)
let url = URL(string: "https://httpbin.org/image/png")!
let placeholderImage = UIImage(named: "placeholder")!
imageView.af_setImage(withURL: url, placeholderImage: placeholderImage)

চিত্রগুলির সাথে কাজ করার জন্য এটির অনেকগুলি কার্যকরী ফাংশন এবং এক্সটেনশন রয়েছে। ক্যাশে থেকে শুরু করে স্কেলিং এবং আকার পরিবর্তন বা এমনকি চিত্রটিতে ফিল্টার প্রয়োগ করা। আপনার অ্যাপ্লিকেশনগুলিতে চিত্রগুলি গুরুত্বপূর্ণ হলে, আমি এই কাঠামোটি ব্যবহার করার এবং আপনার সময় সাশ্রয় করার পরামর্শ দিচ্ছি।


1

সুইফট 5

extension UIImageView {
    func load(url: URL) {
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url) {
                if let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.image = image
                    }
                }
            }
        }
    }
}

ব্যবহারের জন্য

override func awakeFromNib() {
    super.awakeFromNib()
    imgView.load(url: "<imageURLHere>")
}

0

অ্যাসিমাজেভিউয়ের ব্যবহার আপনি ইমেজভিউতে সহজেই চিত্র লোড করতে পারেন।

ইমেজ 1 ইউআরএল: ইউআরএল = ইউআরএল (স্ট্রিং: "(ইমেজুরল)" স্ট্রিং হিসাবে)! ইমেজভিউ.আইমেজ URL = চিত্র 1 ইউআরএল


0

সার্ভার থেকে চিত্র লোড হচ্ছে: -

func downloadImage(from url: URL , success:@escaping((_ image:UIImage)->()),failure:@escaping ((_ msg:String)->())){
    print("Download Started")
    getData(from: url) { data, response, error in
        guard let data = data, error == nil else {
            failure("Image cant download from G+ or fb server")
            return
        }

        print(response?.suggestedFilename ?? url.lastPathComponent)
        print("Download Finished")
        DispatchQueue.main.async() {
             if let _img = UIImage(data: data){
                  success(_img)
            }
        }
    }
}
func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
    URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
}

ব্যবহার: -

  if let url = URL(string: "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png") {
                        self.downloadImage(from:url , success: { (image) in
                            print(image)

                        }, failure: { (failureReason) in
                            print(failureReason)
                        })
                    }

0

হালকা ওজনের লাইব্রেরিতে আরও ভাল পারফরম্যান্স UITableViewবা UICollectionViewব্যবহারের জন্য স্মার্ট অলস লোডিং আপনি যদি url থেকে চিত্রগুলি লোড করতে চান তবে আপনি এই অলস লোডিং পদ্ধতির ব্যবহার করতে পারেন

আইওএস -এ UICollectionViewবা UITableViewব্যবহার করে NSOperationএবং স্মার্ট 'অলস লোডিং' NSOperationQueueসুতরাং এই প্রকল্পে আমরা কোনও অ্যাপ্লিকেশনটির পারফরম্যান্সকে অপ্টিমাইজ করে এবং এর মাধ্যমে কোনও ভিউতে ( UICollectionViewবা UITableView) একাধিক চিত্র ডাউনলোড করতে পারি OperationএবংOperationQueue সম্মতি দিয়ে optim নিম্নলিখিত এই প্রকল্পের মূল পয়েন্টটি স্মার্ট অলস লোড হচ্ছে: চিত্র ডাউনলোড পরিষেবা তৈরি করা হচ্ছে। কোষের দৃশ্যমানতার ভিত্তিতে ডাউনলোডিংকে অগ্রাধিকার দিন।

ইমেজডাউনলোড সার্ভিস ক্লাসটি একটি সিঙ্গলটন দৃষ্টান্ত তৈরি করবে এবং ডাউনলোড করা চিত্রগুলিকে ক্যাশে করার জন্য এনএসকেচে উদাহরণ থাকবে। আমরা আমাদের প্রয়োজন অনুসারে কার্যকারিতা ম্যালড করতে টোপরেশন থেকে অপারেশন ক্লাস উত্তরাধিকারসূত্রে পেয়েছি। আমি মনে করি কার্যকারিতার দিক থেকে অপারেশন সাবক্লাসের বৈশিষ্ট্যগুলি বেশ পরিষ্কার। আমরা কেভিও ব্যবহার করে রাষ্ট্রের অপারেশন পরিবর্তনগুলি পর্যবেক্ষণ করছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.