Swift在背景中发射线程(示例代码)

栏目: 类库 · 发布时间: 2021-04-13

简介  这篇文章主要介绍了Swift在背景中发射线程(示例代码)以及相关的经验技巧,文章约3372字,浏览量379,点赞数1,值得参考!

我正在尝试使用以下代码在后台线程中发送进程:

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)

dispatch_async(backgroundQueue, {
    print("running in the background queue")
    btDiscovery
})

但是这个类只是在前景开始时处理...任何想法?

EDIT1

btDiscovery是一个每隔X秒执行BLE设备扫描的类:

let btDiscoverySharedInstance = Beacon();

class Beacon: NSObject, CBCentralManagerDelegate {

private var centralManager: CBCentralManager?
private var peripheralBLE: CBPeripheral?
....


   func centralManagerDidUpdateState(central: CBCentralManager) {
    switch (central.state) {
    case CBCentralManagerState.PoweredOff:
        print("BLE powered off")
        self.clearDevices()

    case CBCentralManagerState.Unauthorized:
        // Indicate to user that the iOS device does not support BLE.
        print("BLE not supported")
        break

    case CBCentralManagerState.Unknown:
        // Wait for another event
        print("BLE unknown event")
        break

    case CBCentralManagerState.PoweredOn:
        print("BLE powered on")
            self.startScanning()
        break

    case CBCentralManagerState.Resetting:
        print("BLE reset")
        self.clearDevices()

    case CBCentralManagerState.Unsupported:
        print("BLE unsupported event")
        break
    }
}


    func startScanning() {
    print("Start scanning...")
        if let central = centralManager {
            central.scanForPeripheralsWithServices(nil, options: nil)
        }
    }

  func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
    print("Discovered peripheral (RSSI) dBM name: (peripheral.name)")
    print("UUID: (peripheral.identifier.UUIDString)")
    ...
    sleep(delayPolling)
    self.startScanning()
  }

当应用程序启动并保持在前台时,每次“delayPolling”秒都会正确执行扫描。但是只要我的应用程序是背景,扫描就会暂停。只有当它再次回到前台时它才会重新启动。

我需要每次都在后台运行此扫描(即使我们为此线程设置了较低的优先级)。

Aaditi:

通过阅读文档https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html

我知道

当实现中心角色的应用程序包含其Info.plist文件中具有蓝牙中心值的UIBackgroundModes键时,Core Bluetooth框架允许您的应用程序在后台运行以执行某些与蓝牙相关的任务。当您的应用程序处于后台时,您仍然可以发现并连接到外围设备,并探索外围数据并与之交互。此外,当调用任何CBCentralManagerDelegate或CBPeripheralDelegate委托方法时,系统会唤醒您的应用程序

我在Info.plist文件中选择了相应的选项:

enter image description here

但我的应用程序没有在后台运行我的线程。

答案

我意识到这是一个老问题,但在后台扫描需要您提供服务UUID。

central.scanForPeripheralsWithServices(nil, options: nil)

需要是

central.scanForPeripheralsWithServices(serviceUUID, options: nil)

以上就是本文的全部内容,希望对大家的学习有所帮助,版权归原作者或者来源机构所有,感谢作者,如果未能解决你的问题,请参考以下文章。

如何使用swift在Xcode中设置背景图像?

在iOS Swift中不使用AWS SDK在Amazon S3存储桶中上传的背景图像(背景模式)

在Swift 2.0中每隔n分钟更新一次背景中的位置

GCD多线程在swift中的变化

如何使应用程序背景透明,如swift中的通知