到目前为止,我曾经在活动/片段或 ViewModel 中收集我的流,如下所示
活动/片段
lifecycleScope.launch {
myViewModel.readTokenCredentials().collect { data -> /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)
视图模型
viewModelScope.launch {
prefsRepo.readTokenCredentials().collect { data -> /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)
现在,谷歌开发人员告诉我们,这不是一种收集流量的安全方法,因为它可能会导致内存泄漏。相反,他们建议将集合包装在lifecycle.repeatOnLifecycle“活动/片段”中以进行流集合。
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
myViewModel.readTokenCredentials().collect { data -> /* do something */ }
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
为什么在视图模型内收集流时不能使用repeatOnLifecyclewith ?viewModelScope当然,我知道视图模型不具有生命周期意识,但viewModelScope在流收集期间可能不太可能引入内存泄漏?
如何使用 Jetpack Compose 创建内部阴影?渐变应从外部黑色到内部透明。Modifier.shadow()仅适用于外部阴影。使用负高度不起作用。
我得到了这个不公布其服务的Nordic nRF52 BLE外围设备。我可以连接到它,但是无法在iOS上发现服务。由于我知道服务UUID,因此我尝试将它们传递给discoverServices函数。但这是行不通的。
大约30秒后,它终于断开连接。
在外围设备上,GAP广告标记设置为General Discoverable。使用LightBlue或之类的应用程序,nRF Connect我看到外围设备的名称和UUID,但没有任何服务。与LightBlue应用程序连接时,几秒钟后显示错误(Timeout interrogating the peripheral)。
在Android上,发现未发布的服务就可以了。
从《核心蓝牙编程指南》开始,它基本上应该可以工作:
建立与外围设备的连接后,您可以浏览其数据。探索外围设备必须提供的第一步是发现其可用的服务。由于外围设备可以发布的数据量受到大小限制,因此您可能会发现外围设备提供的服务多于其发布的(在其广告包中)所提供的服务。您可以通过调用外围设备的discoverServices:方法来发现外围设备提供的所有服务,如下所示:
[peripheral discoverServices:nil];
有谁知道SDK的区别是什么,以及是否有可能像Android一样在iOS上发现未发布的服务?
我了解到,缓存外设时,iOS能够直接连接,跳过发现过程。但是将外围设备缓存后,需要配对一次。有没有办法手动设置缓存?
感谢任何帮助,谢谢!