Loading/Downloading image from URL on Swift

前端 未结 30 2496
感动是毒
感动是毒 2020-11-21 05:39

I\'d like to load an image from a URL in my application, so I first tried with Objective-C and it worked, however, with Swift, I\'ve a compilation error:

相关标签:
30条回答
  • 2020-11-21 05:48

    If you are looking for a very very simple implementation. (This worked for me in Swift 2)

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

    I implemented within a tableview with a custom cell that has only a image

    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
    
        }
    
    0 讨论(0)
  • 2020-11-21 05:49

    A method for getting the image that is safe and works with Swift 2.0 and X-Code 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)
    }
    

    You would then call this method like so:

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

    If you are updating the view with the image, you will have to use this after the "if success {":

        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
        }
    

    The reason this last part is needed if you are using the image in the UI is because network calls take time. If you try to update the UI using the image without calling dispatch_async like above, the computer will look for the image while the image is still being fetched, find that there is no image (yet), and move on as if there was no image found. Putting your code inside of a dispatch_async completion closure says to the computer, "Go, get this image and when you are done, then complete this code." That way, you will have the image when the code is called and things will work well.

    0 讨论(0)
  • 2020-11-21 05:50
    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)
    
    0 讨论(0)
  • 2020-11-21 05:50

    Use of Ascyimageview you can easy load imageurl in imageview.

    let image1Url:URL = URL(string: "(imageurl)" as String)! imageview.imageURL = image1Url

    0 讨论(0)
  • 2020-11-21 05:52

    Swift 2.2 || Xcode 7.3

    I got Amazing results!! with AlamofireImage swift library

    It provides multiple features like:

    • Asynchronously download
    • Auto Purging Image Cache if memory warnings happen for the app
    • Image URL caching
    • Image Caching
    • Avoid Duplicate Downloads

    and very easy to implement for your app

    Step.1 Install pods


    Alamofire 3.3.x

    pod 'Alamofire'

    AlamofireImage 2.4.x

    pod 'AlamofireImage'

    Step.2 import and Use

    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)
    

    that's it!! it will take care everything


    Great thanks to Alamofire guys, for making iDevelopers life easy ;)

    0 讨论(0)
  • 2020-11-21 05:52

    Swift 2.x answer that downloads image to file (as opposed to Leo Dabus's answer, which stores the image in memory). Based on Leo Dabus's answer and Rob's answer from Get the data from NSURLSession DownloadTaskWithRequest from completion handler:

        // 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
    
    }
    
    0 讨论(0)
提交回复
热议问题