Skip to content

Instantly share code, notes, and snippets.

@latera1n
Last active October 28, 2019 06:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save latera1n/d9ac306e1c9a0396f878c5036871297b to your computer and use it in GitHub Desktop.
Save latera1n/d9ac306e1c9a0396f878c5036871297b to your computer and use it in GitHub Desktop.
//
// ViewController.swift
// VideoChatMessage
//
// Created by LateRain on 1/4/19.
// Copyright © 2019 LateRain. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
setUpChatMessageScheduler()
}
private func setUpChatMessageScheduler() {
let chatMessageScheduler = ChatMessageScheduler()
chatMessageScheduler.startPrintingMessage(1.0)
DispatchQueue.global().asyncAfter(deadline: .now()) {
chatMessageScheduler.chatMessageDidArrive(message: "Message @ time 0.0")
chatMessageScheduler.chatMessageDidArrive(message: "Message @ time 0.0")
chatMessageScheduler.chatMessageDidArrive(message: "Message @ time 0.0")
}
DispatchQueue.global().asyncAfter(deadline: .now() + .milliseconds(2500)) {
chatMessageScheduler.chatMessageDidArrive(message: "Message @ time 2.5")
}
}
}
protocol ChatMessage {
func chatMessageDidArrive(message: String)
func startPrintingMessage(_ timeIntervalInSecond: TimeInterval)
}
class ChatMessageScheduler: ChatMessage {
var queue: Queue<String>
init() {
queue = Queue()
}
func chatMessageDidArrive(message: String) {
queue.enqueue(element: message)
}
func startPrintingMessage(_ timeIntervalInSecond: TimeInterval) {
let timer = Timer(timeInterval: timeIntervalInSecond, repeats: true) { timer in
print(self.queue.dequeue() ?? "No message")
}
RunLoop.current.add(timer, forMode: .common)
}
}
struct Queue<T> {
var reversed: [T]
var array: [T]
init() {
reversed = [T]()
array = [T]()
}
mutating func enqueue(element: T) {
array.append(element)
}
mutating func dequeue() -> T? {
guard reversed.count > 0 || array.count > 0 else {
return nil
}
if reversed.count == 0 {
reversed = array.reversed()
array.removeAll()
}
return reversed.removeLast()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment