异步 Swift 问题
Asynchronous Swift issues
我是一名 Javascript 开发人员,正在 Swift 闲逛,我很难将我找到的示例 Playground 应用程序 (https://github.com/gregiOS/Playgrounds/tree/master/BLE.playground) 迁移到 CLI 应用程序。
import Cocoa
import PlaygroundSupport
let tableViewController = TableViewController()
let dataSource = tableViewController.dataSource
PlaygroundPage.current.liveView = tableViewController.view
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
}
}
我的愿望,我尝试的是只删除 import PlaygroundSupport
和 dataSource
/tableViewController
的东西,只将外围设备打印到标准输出,但是程序只是退出立即地。我尝试使用调度组,但似乎也不起作用:
import Cocoa
let myGroup = DispatchGroup()
print("Scanning...")
myGroup.enter()
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
myGroup.leave()
}
}
myGroup.notify(queue: .main) {
print("Finished all requests.")
}
也尝试使用 myGroup.wait()
但它只是坐在那里什么都不做。我认为部分问题是扫描 运行 无限期地进行,而我只需要它 运行 2 秒左右然后停止。
要点是,我有点头疼,需要创建一个显示蓝牙发现的 PoC。如果有任何指点,我将不胜感激。
要运行 CLI 中的异步内容,您需要运行循环
let runLoop = CFRunLoopGetCurrent()
print("Scanning...")
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
CFRunLoopStop(runLoop)
}
}
CFRunLoopRun()
添加到 ,您不一定需要 运行 循环,除非您的代码使用需要循环的结构(例如 Timer
)。
您也可以拨打dispatchMain
at the end of your program to start the Dispatch system。 dispatchMain
从不returns,所以你需要调用exit(0)
或类似的方法在适当的地方退出程序:
import Dispatch
let myGroup = DispatchGroup()
print("Scanning...")
myGroup.enter()
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
myGroup.leave()
}
}
myGroup.notify(queue: .main) {
print("Finished all requests.")
exit(0)
}
dispatchMain()
我是一名 Javascript 开发人员,正在 Swift 闲逛,我很难将我找到的示例 Playground 应用程序 (https://github.com/gregiOS/Playgrounds/tree/master/BLE.playground) 迁移到 CLI 应用程序。
import Cocoa
import PlaygroundSupport
let tableViewController = TableViewController()
let dataSource = tableViewController.dataSource
PlaygroundPage.current.liveView = tableViewController.view
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
}
}
我的愿望,我尝试的是只删除 import PlaygroundSupport
和 dataSource
/tableViewController
的东西,只将外围设备打印到标准输出,但是程序只是退出立即地。我尝试使用调度组,但似乎也不起作用:
import Cocoa
let myGroup = DispatchGroup()
print("Scanning...")
myGroup.enter()
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
myGroup.leave()
}
}
myGroup.notify(queue: .main) {
print("Finished all requests.")
}
也尝试使用 myGroup.wait()
但它只是坐在那里什么都不做。我认为部分问题是扫描 运行 无限期地进行,而我只需要它 运行 2 秒左右然后停止。
要点是,我有点头疼,需要创建一个显示蓝牙发现的 PoC。如果有任何指点,我将不胜感激。
要运行 CLI 中的异步内容,您需要运行循环
let runLoop = CFRunLoopGetCurrent()
print("Scanning...")
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
CFRunLoopStop(runLoop)
}
}
CFRunLoopRun()
添加到 Timer
)。
您也可以拨打dispatchMain
at the end of your program to start the Dispatch system。 dispatchMain
从不returns,所以你需要调用exit(0)
或类似的方法在适当的地方退出程序:
import Dispatch
let myGroup = DispatchGroup()
print("Scanning...")
myGroup.enter()
let scanner = BluetoothScanner { scanner in
scanner.startScanning { (peripheral) in
print("Discovered peripheral: \(peripheral.tableViewData)")
myGroup.leave()
}
}
myGroup.notify(queue: .main) {
print("Finished all requests.")
exit(0)
}
dispatchMain()