Перечислите устройства, которые находятся в зоне действия устройства Bluetooth в Swift

У меня есть следующий код на площадке Xcode 6:

import Cocoa
import IOBluetooth

class BlueDelegate : IOBluetoothDeviceInquiryDelegate {
    func deviceInquiryComplete(sender: IOBluetoothDeviceInquiry, error: IOReturn, aborted: Bool) {
        aborted
        var devices = sender.foundDevices()
        for device : AnyObject in devices {
            if let thingy = device as? IOBluetoothDevice {
                thingy.getAddress()
            }
        }
    }
}

var inquiry = IOBluetoothDeviceInquiry(delegate: BlueDelegate())
inquiry.start()

Я только начинаю работать с Bluetooth под OSX, и все, что мне сейчас нужно, это список доступных устройств.

Кажется, он не вызывает мой метод делегата вообще.

Я новичок в разработке OSX и Swift, так что будьте осторожны.:)

1 ответ

Решение

Чтобы сказать Playground, что ваш код что-то делает в фоновом режиме, вы должны import XCPlayground и позвонить XCPSetExecutionShouldContinueIndefinitely(),
Это сохранит IOBluetoothDeviceInquiry в Playground и позволит ему вызывать метод делегата после завершения.

import Cocoa
import IOBluetooth
import XCPlayground

class BlueDelegate : IOBluetoothDeviceInquiryDelegate {
    func deviceInquiryComplete(sender: IOBluetoothDeviceInquiry, error: IOReturn, aborted: Bool) {
        aborted
        println("called")
        var devices = sender.foundDevices()
        for device : AnyObject in devices {
            if let thingy = device as? IOBluetoothDevice {
                thingy.getAddress()
            }
        }
    }
}

var delegate = BlueDelegate()
var inquiry = IOBluetoothDeviceInquiry(delegate: delegate)
inquiry.start()
XCPSetExecutionShouldContinueIndefinitely()

Хотя вышеприведенный подход работает, я считаю, что проще создавать простые традиционные тестовые проекты для задач, которые требуют таких понятий, как асинхронный код, делегирование,...

Другие вопросы по тегам