[英]CoreBluetooth on Mac Command line application
我正在嘗試構建一個使用 CoreBluetooth 的命令行應用程序。 問題是,它不適用於命令行應用程序。
我已將我的CoreBluetooth
代碼(一個實現 CBCentralManagerDelegate 協議的類 - 我們稱這個類myBLEManager
)從命令行應用程序項目移動到另一個 Mac OS GUI 應用程序。
我在ViewDidLoad()
中運行了一些測試——超級樣本,我只是初始化了一個myBLEManager
,它在初始化時創建了一個CBCentralManager
的實例,然后調用scanForPeripherals
。
這就是我在 CLI 和 GUI 項目中所做的。 區別是centralManagerDidUpdateState
永遠不會在 CLI 項目中被調用。 但它確實在 GUI Mac 應用程序中。
大多數 Apple 框架中的回調是通過應用程序的主運行循環傳遞的。 如果您的命令行工具沒有運行循環,則它無法接收以這種方式發送的回調。
如果沒有運行循環,框架調用回調的唯一方法是在另一個線程上運行它,這可能會導致應用程序出現意想不到的奇怪行為。
添加以下內容就足夠了:
let runLoop = RunLoop.current
let distantFuture = Date.distantFuture
while running == true && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: distantFuture) {
}
在 Swift 5+ 中,這是 Runloop 的語法:
import Foundation
let runLoop = RunLoop.current
let distantFuture = Date.distantFuture
var shouldKeepRunning = true
while shouldKeepRunning == true && runLoop.run(mode: RunLoop.Mode.default, before: distantFuture) {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.