Revision: 69063
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at April 14, 2015 06:22 by chrisaiv
Initial Code
//
// ViewController.swift
// Concurrency
//
// Created by tommy trojan on 4/11/15.
// Copyright (c) 2015 Skyground Media Inc. All rights reserved.
//
import Foundation
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var nextBuyerLbl: UILabel!
@IBOutlet weak var currentBuyerLbl: UILabel!
@IBOutlet weak var tapeRollLbl: UITextView!
@IBOutlet weak var onAlphaSlider: UISlider!
@IBOutlet weak var resetBtn: UIButton!
@IBOutlet weak var buyBtn: UIButton!
let customers:Array<String> = ["Audrey", "B", "C", "D", "E"]
var currentIdx:Int = 0
var serial:dispatch_queue_t = dispatch_queue_create("com.test.serial", DISPATCH_QUEUE_SERIAL)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
clearLabels()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func viewDidAppear(animated: Bool) {
buyTicket()
}
@IBAction func onAlphaChanged(sender: AnyObject) {
}
@IBAction func onResetClicked(sender: AnyObject) {
}
@IBAction func onBuyClicked(sender: AnyObject) {
buyTicket()
}
func clearLabels(){
updateLabels( "currentBuyerLbl", message: "")
updateLabels( "tapeRollLbl", message: "")
updateLabels( "nextBuyerLbl", message: "")
}
//Serial task
func buyTicket(){
//Increment the index
currentIdx++
if(currentIdx == customers.count ){
//Turn off the BUY button
buyBtn.enabled = false
clearLabels()
updateLabels( "currentBuyerLbl", message: "No more customers.")
}else{
//Switch to new customer
let customerName:String = customers[currentIdx]
dispatch_async(serial, {
//Run simulator to resemble an HTTP request
let num:Double = Simulator.sharedInstance.runSimulatorWithMinTime(2, maxTime: 5)
//You cannot update the UIX from a background thread so you call this data back up the main UIX.
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//Update the text label with the new async data
self.updateLabels("currentBuyerLbl", message: "Current: " + self.customers[self.currentIdx])
self.updateLabels("tapeRollLbl", message: "\(customerName) bought tickets in \(num).")
var nextIdx:Int = self.currentIdx + 1
self.updateLabels( "nextBuyerLbl", message: "Next:self. " + self.customers[nextIdx])
})
})
//Customer Will Now Pay
submitPayment(customerName)
}
}
//Parallel task
func submitPayment(customerName:String){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { ()-> Void in
//Run simulator to resemble an HTTP request
let num:Double = Simulator.sharedInstance.runSimulatorWithMinTime(2, maxTime: 5)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//Update the text label with the new async data
self.updateLabels("tapeRollLbl", message: "\(customerName) paid in \(num).")
})
})
}
func updateLabels(label:String, message:String){
switch(label){
case "currentBuyerLbl":
currentBuyerLbl.text = message
break
case "nextBuyerLbl":
nextBuyerLbl.text = message
break
case "tapeRollLbl":
var oldMessage:String = tapeRollLbl.text
var newMessage:String = "\(message) \n"
tapeRollLbl.text = oldMessage + newMessage
break
default :
break
}
}
}
class Simulator {
class var sharedInstance: Simulator {
struct Static {
static let instance: Simulator = Simulator()
}
return Static.instance
}
func runSimulatorWithMinTime( minTime:Int, maxTime:Int ) -> Double {
//Calculate random thread wait time
let ms:Int = ( Int(rand()) % ((maxTime - minTime) * 1000) ) + (minTime * 1000)
let waitTime:Double = Double(ms) / 1000.0;
let timer:Void = NSThread.sleepForTimeInterval(waitTime)
println( "Simulator.runSimulatorWithMinTime:", waitTime )
return waitTime
}
}
Initial URL
Initial Description
This simple example shows how a customer can buy a ticket within a specific line but then payment can happen in parallel.
Initial Title
SWIFT: Concurrency simplified
Initial Tags
Initial Language
Objective C