Skip to content

Instantly share code, notes, and snippets.

@yume190
Last active February 21, 2018 14:59
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 yume190/92f6ae269f69917db21a4dcf60978c35 to your computer and use it in GitHub Desktop.
Save yume190/92f6ae269f69917db21a4dcf60978c35 to your computer and use it in GitHub Desktop.
仿 Android HandlerThread 的 Message Queue(一小部分功能)
import Foundation
public class MessageQueue {
public typealias Message = Void -> Void
private var exitFlag = false
private var messageQueue:[Message] = []
private var loopInterval:Double
public let dispatchQueue:dispatch_queue_t
public init? (name:String,loopInterval:Double = 0.5) {
guard let _dispatchQueue = dispatch_queue_create(name, DISPATCH_QUEUE_SERIAL) else {
return nil
}
self.loopInterval = loopInterval
self.dispatchQueue = _dispatchQueue
self.loopAfterInBackground() {
self.loop()
}
}
private func loop() {
if exitFlag {
return
}
if let msg = messageQueue.first {
messageQueue.removeFirst(1)
handleMessage(msg)
}
loopAfterInBackground() {
self.loop()
}
}
private func loopAfterInBackground(block:dispatch_block_t) {
let queue = dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)
let nanoSeconds = Int64(loopInterval * Double(NSEC_PER_SEC))
let time = dispatch_time(DISPATCH_TIME_NOW, nanoSeconds)
let _block = dispatch_block_create(DISPATCH_BLOCK_INHERIT_QOS_CLASS, block)
dispatch_after(time, queue, _block)
}
private func handleMessage(msg:Message) {
dispatch_sync(dispatchQueue) {
msg()
}
}
public func sendMessage(msg:Message) {
messageQueue.append(msg)
}
public func clear() {
messageQueue = []
}
public func exit() {
exitFlag = true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment