Last active
February 21, 2018 14:59
-
-
Save yume190/92f6ae269f69917db21a4dcf60978c35 to your computer and use it in GitHub Desktop.
仿 Android HandlerThread 的 Message Queue(一小部分功能)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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