ios - 为什么我的 Swift iOS 构建会出错:“在范围内找不到‘睡眠’”
问题描述
.swift 文件是 iOS ObjC 静态库的一部分。当我尝试构建时,我得到构建错误。
睡眠是因为我想确保停止扫描完成,然后想完全优雅地拆除 CBCentralManager。
import UIKit
import CoreBluetooth
import os
// Instantiate BLE central service:
var BLE_Central_instance = BLE_Central();
. . .
// Tears down BLE central
public func stop_BLE_Central()
{
os_log("BLE_Central: stop_BLE_Central...")
BLE_Central_instance.stop_CBCentralManager()
os_log("BLE_Central: stop_BLE_Central done.")
}
. . .
@objc open class BLE_Central: NSObject
{
. . .
@objc public func stop_CBCentralManager()
{
os_log("BLE_Central: stop_CBCentralManager...")
centralManager.stopScan()
os_log(" Scanning stopped (ie. centralManager)")
Sleep(5)
centralManager = nil
data.removeAll(keepingCapacity: false)
os_log("BLE_Central: stop_CBCentralManager done.")
}
解决方案
通过这里的各种方法,
Sleep(5)
这不起作用,因为没有这样的功能Sleep()
。可以通过使用来解决这个问题
Thread.sleep(forTimeInterval: 5)
这样可以避免错误,但由于几个原因,它的设计确实很糟糕。第一个是你阻塞线程5秒,从外观上看,它是主线程。在此期间,这完全锁定了您的用户界面。如果主线程被阻塞,则没有 UI 元素可以响应。
你可以通过使用类似的东西来避免这种情况
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
// Do delayed stuff here
}
这不会阻塞当前线程,它说,现在继续运行,但在 5 秒内完成这些工作。所以这更好,或者至少不那么糟糕。
这里是一个糟糕的想法的第二个原因Thread.sleep
是,它是一种糟糕的创可贴。不能保证 5 秒是正确的时间量。可能太多,也可能太少。您需要的时间量可能不一致。您希望 5 秒就足够了,但您无法知道这一点。
更好的方法是寻找你真正想知道的东西。您正在使用CBCentralManager
并且想知道它何时停止扫描。所以,当它的值从变为时,使用isScanning
属性并做你的事情。CBCentralManager
true
false
首先,确保@objc
在您的中央管理器声明中使用,并添加一个观察属性:
@objc fileprivate(set) var central: CBCentralManager
var observation: NSKeyValueObservation?
然后注册已更改的通知isScanning
,并处理这些更改:
observation = observe(\.central.isScanning, options: NSKeyValueObservingOptions.new) { (manager, change) in
guard let isScanning = change.newValue else { return }
if !isScanning {
// Do your delayed stuff here
}
}
推荐阅读
- html - 如何将 html 传单地图插入博客文章(雨果网站)?
- java - 使用 Gradle 对 Sonarqube 8 的 Jacoco 代码覆盖率
- c++ - 我可以安全地 memset 一个具有用户定义构造函数的非平凡 C++ 结构吗?
- python - Python - 使用 For 循环打印数组
- python - 预测多项式值
- unetstack - 使用 JSON 远程访问 Unet 调制解调器
- html - 图片未在 Iphone 上显示,但在 dekstop 或 Android 手机上显示
- python - TensorFlow 教程 训练模型的图像少于预期
- ruby-on-rails - Ruby Net::IMAP - 带有特殊字符/变音符号的附件文件名
- python - 用 HTML 字符串提取 HTML 表 - Python / Beautiful Soup