我在一个打字稿服务器框架Nest中使用Mongoose数据库和Mongoose数据库。
我有2个mongo集合,其中一个包含20,000个用户位置。另一个集合包含从Google Places API收集的10,000个兴趣点。
现在,我想找到收集的位置与这些位置(包含经纬度的GeoJSON点)之间的交点。
换句话说,我正在寻找与这些POI用户相关的位置。
当前,我有一个异步方法,该方法将使用nearSphere运算符查找点附近的所有位置。
然后,我认为下一步将是遍历mongo集合中的每个位置(其中10,000个)并在每个位置上运行此方法。这样,我将获得一个列表,其中列出了在捕获特定位置时“附近”的POI。
有一个更好的方法吗?关于性能,我相信这种方式会遇到困难。我找不到mongo地理空间查询,该查询可让我将两组位置进行比较。
async findAllNearPlace(coords): Promise<Location[]> {
return await this.locationModel.find(
{
location:
{ $nearSphere:
{
$geometry: { type: "Point", coordinates: coords },
$minDistance: 0,
$maxDistance: 100
}
}
}
);
}
Run Code Online (Sandbox Code Playgroud)
每个POI-检查位置:
async findUsersInProximity(places): Promise<Location[]> {
const locations = [];
let i = places.length - 1;
while (i > 0) {
await this.findAllNearPlace(
places[i].location.coordinates
).then(intersectingLocations => {
locations.push(...intersectingLocations);
i--;
});
}
return await locations;
}
Run Code Online (Sandbox Code Playgroud)
不出所料,它的性能很差,需要几分钟。
我正在使用 BCryptPasswordEncoder 来加密用户注册和登录。
注册部分工作正常,它使用密码将新用户放入数据库,例如:
'$2a$10$aUk/26idLhSaNmhNRTRejd03FnxxLxv6X0Uo0P4PcA4mbyy.
Run Code Online (Sandbox Code Playgroud)
当我登录时,输入的用户名匹配,我成功地从存储库中找到了一个用户。
然后我被告知用户名或密码错误。当我从程序中删除此加密时,它工作正常。所以基本上我在比较加密密码时做错了什么。
这是我的 UserDetailsService 实现逻辑:
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
System.out.println(username);
User user = userRepository.findByUsername(username);
System.out.println(user.getPassword());
if (user.getUsername().isEmpty()) {
throw new UsernameNotFoundException(
"No user found with username: "+ username);
}
boolean enabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
return new org.springframework.security.core.userdetails.User
(user.getUsername(),
user.getPassword().toLowerCase(), enabled, accountNonExpired,
credentialsNonExpired, accountNonLocked,
getAuthorities(Arrays.asList("ROLE_USER")));
}
private static List<GrantedAuthority> getAuthorities (List<String> roles) {
List<GrantedAuthority> authorities = new ArrayList<>();
for (String role : …Run Code Online (Sandbox Code Playgroud) 我需要检查应用程序是否移到后台。为什么?
嗯,因为我的应用程序支持蓝牙,并且一次只能连接一个人。因此,如果他们不使用它并且应用程序在后台,请断开它们并将它们发送到连接主页。
现在我已经做到了。我在主要的第一类中有一个选择器和一个断开连接并发送到第一页的函数。但我没有意识到的是,如果将控制面板向上拖动,则该应用程序位于“后台”中。
环顾四周,似乎没有办法检测控制面板是否已启动。那么有没有人对我如何以不同的方式做到这一点有任何想法?
实际上,我只是想要它,因此如果应用程序因任何其他原因而不是控制面板被调出而移至后台,请断开与设备的连接。
选择器:
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: Notification.Name.UIApplicationWillResignActive, object: nil)
Run Code Online (Sandbox Code Playgroud)
功能:
@objc func appMovedToBackground() {
if (ViewController.connectedPeripheral != nil) {
print("App moved to background!")
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "connectView") as! ViewController
self.navigationController?.pushViewController(nextViewController, animated: true)
ViewController.centralManager.cancelPeripheralConnection(ViewController.connectedPeripheral!)
}
else {
print("App moved to background but no device is connected so no further action taken")
}
}
Run Code Online (Sandbox Code Playgroud)
这不是其他问题的重复。我知道如何检查应用程序是否处于后台状态。我只是不想在控制面板出现时断开连接...
我最近有一个应用程序被商店拒绝,原因如下:
我们的应用程序在 Info.plist 文件的 UIBackgroundModes 键中声明了对外部配件的支持,但没有声明您的应用程序支持的任何外部配件协议。外部配件后台模式适用于通过外部配件框架与硬件配件通信的应用程序。
我已经阅读了以前提出这个问题的人的一些答案,但我不确定我的情况。我的应用程序通过发送和接收字节与 HM10 蓝牙低功耗模块进行通信。
在我的 info.plist 中,我声明该应用程序使用 CoreBluetooth 并与配件进行通信。我需要更改哪一部分来解决苹果问题?
另外,我需要成为 MFI 计划的一部分才能使用这款 HM10 蓝牙模块吗?谢谢。
这是我的 info.plist,谢谢!
另外 - 背景模式:
奇怪的问题真的,但在这里。
我有一个带有一些自定义单元格的表格视图。在较大的设备上,它们都适合并且看起来很棒。
然而,在 iPhone 4 等较小的设备上,由于页面上的其他内容,表格视图会缩小,因此并非所有单元格都在视图中。
问题:
如果不实际滚动视图,就不可能知道还有任何其他单元格。
有没有解决的办法?
谢谢。
ios ×3
swift ×2
app-store ×1
background ×1
encryption ×1
geospatial ×1
hm-10 ×1
iphone ×1
java ×1
location ×1
mongodb ×1
mongoose ×1
performance ×1
security ×1
selector ×1
spring ×1
spring-boot ×1
uitableview ×1
xcode ×1