Skip to content

Instantly share code, notes, and snippets.

Avatar
⌨️
consider multiple solutions, commit on one, and iterate

Yuchen yzhong52

⌨️
consider multiple solutions, commit on one, and iterate
View GitHub Profile
@yzhong52
yzhong52 / Api.Swift
Created Feb 16, 2020
Building a Client App From Scratch
View Api.Swift
import Foundation
class Article: Decodable {
let title: String
let description: String?
let url: URL
let urlToImage: String?
let content: String?
}
@yzhong52
yzhong52 / ViewController.swift
Last active Feb 16, 2020
Building a Client App From Scratch (ViewController with Client and TableView)
View ViewController.swift
import UIKit
import RxSwift
import SafariServices
class ViewController: UIViewController {
private let disposeBag = DisposeBag()
private let client = NewsClient()
private var articles: [Article] = []
@yzhong52
yzhong52 / NewsClient.swift
Last active Feb 16, 2020
Building a Client App From Scratch (NewsClient)
View NewsClient.swift
// TODO: update the API key
private let apiKey: String = "c8707b3709a34bbe90837f63c71537ed"
private let path: String = "https://newsapi.org/v2/top-headlines?apiKey=\(apiKey)&country=us"
enum ClientError: Error {
case missingResponseData
}
class NewsClient {
func headlines() -> Single<ArticlesResponse> {
@yzhong52
yzhong52 / ViewController.swift
Last active Feb 16, 2020
Building a Client App From Scratch (ViewController with UITableViewDelegate)
View ViewController.swift
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let article = articles[indexPath.row]
present(SFSafariViewController(url: article.url), animated: true, completion: nil)
}
}
@yzhong52
yzhong52 / ViewController.swift
Last active Feb 16, 2020
Building a Client App From Scratch (UITableViewDataSource)
View ViewController.swift
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return articles.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
@yzhong52
yzhong52 / ImagesManager.swift
Created Feb 16, 2020
Building a Client App From Scratch - Image download extension
View ImagesManager.swift
import UIKit
import Alamofire
class ImageManager {
private let session = Alamofire.Session()
static let shared = ImageManager()
func load(url: URLConvertible, completionHandler: @escaping (UIImage) -> Void) -> Void {
@yzhong52
yzhong52 / gist:3f1497d7c58c7b1b0d97236b1e0d39ba
Created Feb 16, 2020
Building a Client App From Scratch (UITableViewDataSource v2)
View gist:3f1497d7c58c7b1b0d97236b1e0d39ba
extension ViewController: UITableViewDataSource {
...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let tableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NewsTableViewCell
let article = articles[indexPath.row]
tableViewCell.titleLabel.text = article.title
tableViewCell.contentLabel.text = article.content
@yzhong52
yzhong52 / LoadState.swift
Created Feb 16, 2020
Building a Client App From Scratch - LoadState
View LoadState.swift
import Foundation
enum LoadState<T> {
case loading
case updating
case loaded(response: T)
case failed(error: Error)
}
@yzhong52
yzhong52 / NewsManager.swift
Created Feb 16, 2020
Building a Client App From Scratch - NewsManager
View NewsManager.swift
import Foundation
import RxSwift
import RxCocoa
class NewsManager {
typealias NewsLoadState = LoadState<ArticlesResponse>
enum LoadError: Error {
case unknownError
}
@yzhong52
yzhong52 / ViewController.swift
Created Feb 16, 2020
Building a Client App From Scratch - ViewController NewsManager
View ViewController.swift
class ViewController: UIViewController {
private let manager = NewsManager()
private let disposeBag = DisposeBag()
private var articles: [Article] = []
private let titleLabel: UILabel = {
let label = UILabel()
label.text = NSLocalizedString("News", comment: "")
You can’t perform that action at this time.