Skip to content

Instantly share code, notes, and snippets.

@crenwick
Created November 18, 2015 16:47
Show Gist options
  • Save crenwick/cf9f39031d75b4f6a0b7 to your computer and use it in GitHub Desktop.
Save crenwick/cf9f39031d75b4f6a0b7 to your computer and use it in GitHub Desktop.
MVVM Pattern
import UIKit
struct Article {
var title: String
var body: String
var date: NSDate
var saved: Bool
var thumbnail: NSURL
}
protocol ArticleViewViewModel {
var title: String { get }
var body: String { get }
var date: String { get }
var thumbnail: UIImage? { get }
}
struct ArticleViewViewModelFromArticle: ArticleViewViewModel {
let article: Article
let title: String
let body: String
let date: String
var thumbnail: UIImage?
init(_ article: Article) {
self.article = article
self.title = article.title
self.body = article.body
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
self.date = dateFormatter.stringFromDate(article.date)
let downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(article.thumbnail) {
location, response, error -> Void in
if let data = NSData(contentsOfURL: location!) {
if let image = UIImage(data: data) {
self.thumbnail = image
}
}
}
downloadTask.resume()
}
}
// this would normally take the ViewController delegates
class ArticleViewController {
var bodyTextView: UITextView!
var titleLabel: UILabel!
var dateLabel: UILabel!
var thumbnailImageView: UIImageView!
var viewModel: ArticleViewViewModel! {
didSet {
titleLabel.text = viewModel.title
bodyTextView.text = viewModel.body
dateLabel.text = viewModel.date
thumbnailImageView.image = viewModel.thumbnail
}
}
init() {
}
}
let article = Article(title: "title text", body: "lorem ipsum", date: NSDate(), saved: true, thumbnail: NSURL(string: "www.google.com")!)
let viewModel = ArticleViewViewModelFromArticle(article)
let viewController = ArticleViewController()
viewController.viewModel = viewModel
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment