Skip to content

Instantly share code, notes, and snippets.

@Jxrgxn
Last active July 15, 2016 15:07
Show Gist options
  • Save Jxrgxn/5695196e87ae7d4a0cb178b1381c0649 to your computer and use it in GitHub Desktop.
Save Jxrgxn/5695196e87ae7d4a0cb178b1381c0649 to your computer and use it in GitHub Desktop.
Proposed Approach to Hyperlinks
//
// StockQuoteItem.swift
// testProject
//
// Created by Basel Farag on 7/15/16.
// Copyright © 2016 Basel Farag. All rights reserved.
import Foundation
class StockQuoteItem {
let symbol: String
let ask: String
let yearHigh: String
let yearLow: String
required init(stockSymbol: String, stockAsk: String, stockYearHigh: String, stockYearLow: String) {
self.symbol = stockSymbol
self.ask = stockAsk
self.yearHigh = stockYearHigh
self.yearLow = stockYearLow
}
class func endpointForFeed(symbols: Array<String>) -> String {
// let wrappedSymbols = symbols.map { $0 = "\"" + $0 + "\"" }
let symbolsString:String = symbols.joinWithSeparator("\", \"")
let query = "select * from yahoo.finance.quotes where symbol in (\"\(symbolsString) \")&format=json&env=http://datatables.org/alltables.env"
let encodedQuery = query.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
let endpoint = "https://query.yahooapis.com/v1/public/yql?q=" + encodedQuery!
return endpoint
}
class func getFeedItems(symbols: Array<String>, completionHandler: (Array<StockQuoteItem>?, NSError?) -> Void) {
Alamofire.request(.GET, self.endpointForFeed(symbols))
.responseItemsArray { (request, response, itemsArray, error) in
if let anError = error
{
completionHandler(nil, error)
return
}
completionHandler(itemsArray, nil)
}
}
}
extension Alamofire.Request {
class func itemsArrayResponseSerializer() -> Serializer {
return { request, response, data in
if data == nil {
return (nil, nil)
}
var jsonString = NSString(data: data!, encoding:NSUTF8StringEncoding)
var jsonError: NSError?
let jsonData:AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.AllowFragments, error: &jsonError)
if jsonData == nil || jsonError != nil
{
return (nil, jsonError)
}
let json = JSON(jsonData!)
if json.error != nil || json == nil
{
return (nil, json.error)
}
var itemsArray:Array<StockQuoteItem> = Array<StockQuoteItem>()
let quotes = json["query"]["results"]["quote"].arrayValue
for jsonItem in quotes
{
let symbol = jsonItem["symbol"].stringValue
let yearLow = jsonItem["YearLow"].stringValue
let yearHigh = jsonItem["YearHigh"].stringValue
let ask = jsonItem["Ask"].stringValue
let item = StockQuoteItem(stockSymbol: symbol, stockAsk: ask, stockYearHigh: yearHigh, stockYearLow: yearLow)
itemsArray.append(item)
}
return (itemsArray, nil)
}
}
func responseItemsArray(completionHandler: (NSURLRequest, NSHTTPURLResponse?, Array<StockQuoteItem>?, NSError?) -> Void) -> Self {
return response(serializer: Request.itemsArrayResponseSerializer(), completionHandler: { (request, response, itemsArray, error) in
completionHandler(request, response, itemsArray as? Array<StockQuoteItem>, error)
})
}
}
//
// StockQuoteItem.swift
// testProject
//
// Created by Basel Farag on 7/15/16.
// Copyright © 2016 Basel Farag. All rights reserved.
//
/* Feed of Apple, Yahoo & Google stock prices (ask, year high & year low) from Yahoo ( https://query.yahooapis.com/v1/public/yql?q=select%20symbol%2C%20Ask%2C%20YearHigh%2C%20YearLow%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22%2C%20%22GOOG%22%2C%20%22YHOO%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys ) looks like
{
"query": {
"count": 3,
"created": "2015-04-29T16:21:42Z",
"lang": "en-us",
"results": {
"quote": [
{
"symbol": "AAPL"
"YearLow": "82.904",
"YearHigh": "134.540",
"Ask": "129.680"
},
...
]
}
}
}
*/
import Foundation
class StockQuoteItem {
let symbol: String
let ask: String
let yearHigh: String
let yearLow: String
required init(stockSymbol: String, stockAsk: String, stockYearHigh: String, stockYearLow: String) {
self.symbol = stockSymbol
self.ask = stockAsk
self.yearHigh = stockYearHigh
self.yearLow = stockYearLow
}
class func endpointForFeed(symbols: Array<String>) -> String {
// let wrappedSymbols = symbols.map { $0 = "\"" + $0 + "\"" }
let symbolsString:String = symbols.joinWithSeparator("\", \"")
let query = "select * from yahoo.finance.quotes where symbol in (\"\(symbolsString) \")&format=json&env=http://datatables.org/alltables.env"
let encodedQuery = query.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
let endpoint = "https://query.yahooapis.com/v1/public/yql?q=" + encodedQuery!
return endpoint
}
class func getFeedItems(symbols: Array<String>, completionHandler: (Array<StockQuoteItem>?, NSError?) -> Void) {
Alamofire.request(.GET, self.endpointForFeed(symbols))
.responseItemsArray { (request, response, itemsArray, error) in
if let anError = error
{
completionHandler(nil, error)
return
}
completionHandler(itemsArray, nil)
}
}
}
extension Alamofire.Request {
class func itemsArrayResponseSerializer() -> Serializer {
return { request, response, data in
if data == nil {
return (nil, nil)
}
var jsonString = NSString(data: data!, encoding:NSUTF8StringEncoding)
var jsonError: NSError?
let jsonData:AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.AllowFragments, error: &jsonError)
if jsonData == nil || jsonError != nil
{
return (nil, jsonError)
}
let json = JSON(jsonData!)
if json.error != nil || json == nil
{
return (nil, json.error)
}
var itemsArray:Array<StockQuoteItem> = Array<StockQuoteItem>()
let quotes = json["query"]["results"]["quote"].arrayValue
for jsonItem in quotes
{
let symbol = jsonItem["symbol"].stringValue
let yearLow = jsonItem["YearLow"].stringValue
let yearHigh = jsonItem["YearHigh"].stringValue
let ask = jsonItem["Ask"].stringValue
let item = StockQuoteItem(stockSymbol: symbol, stockAsk: ask, stockYearHigh: yearHigh, stockYearLow: yearLow)
itemsArray.append(item)
}
return (itemsArray, nil)
}
}
func responseItemsArray(completionHandler: (NSURLRequest, NSHTTPURLResponse?, Array<StockQuoteItem>?, NSError?) -> Void) -> Self {
return response(serializer: Request.itemsArrayResponseSerializer(), completionHandler: { (request, response, itemsArray, error) in
completionHandler(request, response, itemsArray as? Array<StockQuoteItem>, error)
})
}
}
//
// ViewController.swift
// testProject
//
// Created by Basel Farag on 6/21/16.
// Copyright © 2016 Basel Farag. All rights reserved.
//
import UIKit
enum StockType {
case Tech
case Cars
case Telecom
}
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var itemsArray:Array<StockQuoteItem>?
@IBOutlet var tableView: UITableView?
var stockType: StockType = .Tech
var refreshControl = UIRefreshControl()
var dateFormatter = NSDateFormatter()
override func viewDidLoad() {
super.viewDidLoad()
self.dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
self.dateFormatter.timeStyle = NSDateFormatterStyle.LongStyle
self.refreshControl.backgroundColor = UIColor.clearColor()
self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.refreshControl.addTarget(self, action: #selector(ViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
self.tableView?.addSubview(refreshControl)
self.loadStockQuoteItems()
}
func symbolsStringForCurrentStockType() -> Array<String>
{
switch self.stockType {
case .Tech:
return ["AAPL", "GOOG", "YHOO"]
case .Cars:
return ["GM", "F"]
case .Telecom:
return ["T", "VZ", "CMCSA"]
}
}
@IBAction func stockTypeSegmentedControlValueChanged(sender: UISegmentedControl)
{
switch sender.selectedSegmentIndex {
case 0:
self.stockType = .Tech
case 1:
self.stockType = .Cars
case 2:
self.stockType = .Telecom
default:
print("Segment index out of known range, do you need to add to the enum or switch statement?")
}
// load data for our new symbols
refresh(sender)
}
func loadStockQuoteItems() {
let symbols = symbolsStringForCurrentStockType()
StockQuoteItem.getFeedItems(symbols, completionHandler: { (items, error) in
if error != nil
{
let alert = UIAlertController(title: "Error", message: "Could not load stock quotes :( \(error?.localizedDescription)", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
self.itemsArray = items
// update "last updated" title for refresh control
let now = NSDate()
let updateString = "Last Updated at " + self.dateFormatter.stringFromDate(now)
self.refreshControl.attributedTitle = NSAttributedString(string: updateString)
if self.refreshControl.refreshing
{
self.refreshControl.endRefreshing()
}
self.tableView?.reloadData()
})
}
func refresh(sender:AnyObject)
{
self.loadStockQuoteItems()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.itemsArray?.count ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let item = self.itemsArray?[indexPath.row]
cell.textLabel?.text = ""
cell.detailTextLabel?.text = ""
if let symbol = item?.symbol, ask = item?.ask
{
cell.textLabel?.text = symbol + " @ $" + ask
}
if let low = item?.yearLow, high = item?.yearHigh
{
cell.detailTextLabel?.text = "Year: " + low + " - " + high
}
return cell
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment