异步 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 PlaygroundSupportdataSource/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 systemdispatchMain从不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()