Jxrgxn
7/15/2016 - 3:03 PM

Proposed Approach to Hyperlinks

Proposed Approach to Hyperlinks

//
//  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
    }
    
}
//
//  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)
        })
    }
}
//
//  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)
        })
    }
}