Skip to content

Instantly share code, notes, and snippets.

@ksmandersen
Last active January 20, 2016 14:56
Show Gist options
  • Select an option

  • Save ksmandersen/6ace1da0d4372202506e to your computer and use it in GitHub Desktop.

Select an option

Save ksmandersen/6ace1da0d4372202506e to your computer and use it in GitHub Desktop.

Revisions

  1. ksmandersen revised this gist Jan 20, 2016. 1 changed file with 16 additions and 0 deletions.
    16 changes: 16 additions & 0 deletions RemoteImage.swift
    Original file line number Diff line number Diff line change
    @@ -2,10 +2,18 @@ import UIKit
    import Forbind
    import ForbindExtensions

    enum LoadingState {
    case NotSet
    case Loading
    case Loaded
    }

    class RemoteImageView: UIImageView {
    private(set) var URL: NSURL?
    private(set) var state: LoadingState = .NotSet

    private var imagePromise: Promise<Result<UIImage>>?
    private var placeholderImage: UIImage?

    init() {
    super.init(image: nil)
    @@ -21,7 +29,15 @@ class RemoteImageView: UIImageView {
    fatalError("init(coder:) has not been implemented")
    }

    func cancelImage() {
    self.imagePromise = nil
    if let placeholder = self.placeholderImage {
    self.image = placeholder
    }
    }

    func loadImage(URL: NSURL, placeholderImage: UIImage? = nil) {
    self.placeholderImage = placeholderImage
    self.image = placeholderImage
    self.URL = URL

  2. ksmandersen revised this gist Jan 6, 2016. No changes.
  3. ksmandersen revised this gist Jan 6, 2016. 1 changed file with 1 addition and 2 deletions.
    3 changes: 1 addition & 2 deletions RemoteImage.swift
    Original file line number Diff line number Diff line change
    @@ -32,8 +32,7 @@ class RemoteImageView: UIImageView {
    guard let URL = self.URL else { return }

    let session = NSURLSession.sharedSession()
    let request = NSURLRequest(URL: URL)
    let dataTask = session.dataTask(request)
    let dataTask = session.dataTask(URL)

    self.imagePromise = dispatchAsync(dataTask => { UIImage(data: $0.0) }, queue: dispatch_get_main_queue())

  4. ksmandersen revised this gist Jan 6, 2016. 1 changed file with 0 additions and 7 deletions.
    7 changes: 0 additions & 7 deletions RemoteImage.swift
    Original file line number Diff line number Diff line change
    @@ -2,15 +2,8 @@ import UIKit
    import Forbind
    import ForbindExtensions

    enum LoadingState {
    case NotSet
    case Loading
    case Loaded
    }

    class RemoteImageView: UIImageView {
    private(set) var URL: NSURL?
    private(set) var state: LoadingState = .NotSet

    private var imagePromise: Promise<Result<UIImage>>?

  5. ksmandersen created this gist Jan 6, 2016.
    53 changes: 53 additions & 0 deletions RemoteImage.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    import UIKit
    import Forbind
    import ForbindExtensions

    enum LoadingState {
    case NotSet
    case Loading
    case Loaded
    }

    class RemoteImageView: UIImageView {
    private(set) var URL: NSURL?
    private(set) var state: LoadingState = .NotSet

    private var imagePromise: Promise<Result<UIImage>>?

    init() {
    super.init(image: nil)
    }

    convenience init(URL: NSURL, placeholderImage: UIImage) {
    self.init()

    loadImage(URL, placeholderImage: placeholderImage)
    }

    required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }

    func loadImage(URL: NSURL, placeholderImage: UIImage? = nil) {
    self.image = placeholderImage
    self.URL = URL

    sendImageRequest()
    }

    private func sendImageRequest() {
    guard let URL = self.URL else { return }

    let session = NSURLSession.sharedSession()
    let request = NSURLRequest(URL: URL)
    let dataTask = session.dataTask(request)

    self.imagePromise = dispatchAsync(dataTask => { UIImage(data: $0.0) }, queue: dispatch_get_main_queue())

    self.imagePromise?.getValueWeak { [weak self] result in
    if let image = result.okValue {
    self?.image = image
    }
    }
    }
    }