Асинхронные проблемы Swift - PullRequest
       12

Асинхронные проблемы Swift

0 голосов
/ 08 декабря 2018

Я - разработчик 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, показывающий обнаружение Bluetooth. Я был бы очень признателен за любые указатели.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Добавляя к ответ vadian , вам не обязательно нужен цикл выполнения, если в вашем коде не используются конструкции, для которых он необходим (например, Timer).

Вы также можете вызвать dispatchMain в конце вашей программы для запуска Диспетчерская система .dispatchMain никогда не возвращается, поэтому вам нужно позвонить 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()
0 голосов
/ 08 декабря 2018

Для запуска асинхронного содержимого в CLI необходим runloop

let runLoop = CFRunLoopGetCurrent()
print("Scanning...")

let scanner = BluetoothScanner { scanner in
  scanner.startScanning { (peripheral) in
    print("Discovered peripheral: \(peripheral.tableViewData)")
    CFRunLoopStop(runLoop)
  }
}

CFRunLoopRun()
...