过去24小时我一直在玩Parse。我发现PFGeoPoint
功能非常强大,但是,抓取当前位置大约需要1.5秒。因此,您必须在同一个块操作中运行其他查询,这些查询需要将当前位置作为方案中的参数。
我一直在与return query
进行斗争,因为它说该方法提供了'不兼容的块指针类型发送' PFQuery&#39}。参数类型' void PFGeoPoint。'
任何人都可以帮忙吗?我认为这或多或少对于经验丰富的块操作而且不一定是Parse ....所以我尽力解释这个问题。
- (PFQuery *)queryForTable {
[PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {
PFQuery *query = [PFQuery queryWithClassName:@"Testing"];
[query whereKey:@"Geo" nearGeoPoint:geoPoint withinMiles:20];
[query orderByDescending:@"createdAt"];
// Error causing
return query;
}];
}
答案 0 :(得分:2)
你需要重写你的逻辑。您不能指望queryForTable
方法的返回值。因此,在您的代码中,您应不这样做:
PFQuery *pfQuery = [self queryForTable];
相反,您需要将完成块传递给您的方法,该方法将在接收地理位置时触发。这会是这样的:
-(void)queryForTableWithCompletionHandler:(void(^)(PFQuery*))completionHandler
{
[PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {
PFQuery *query = [PFQuery queryWithClassName:@"Testing"];
[query whereKey:@"Geo" nearGeoPoint:geoPoint withinMiles:20];
[query orderByDescending:@"createdAt"];
// Instead of return
// return query;
// call completion block here
completionHandler(query);
}];
}
所以现在你将这个方法称为:
[self queryForTableWithCompletionHandler:^(PFQuery *query) {
// Now make use of query object
}];
我想你需要深入研究一下块来理解实现。 Apple对此有一个整洁的documentation。
答案 1 :(得分:1)
您无法返回查询,该方法只接受具有void返回类型的块。参考Parse文档here:
方法geoPointForCurrentLocationInBackground:
接受一个参数,一个具有void返回类型的块,它只接受两个参数; PFGeoPoint *geoPoint
和NSError *error
。
如果您对块的使用感到困惑,请参阅Apple官方文档here。如果您没有时间阅读所有关于块及其工作方式,this证明是一个有用的参考点。
答案 2 :(得分:-1)
你不能在一个区块内返回,因为它是异步操作,而你的功能不是。这意味着您的上述代码将在另一个线程上调用geoPointForCurrentLocation,并在完成后运行该块。但是,对queryForTable的调用是在主线程上并且是同步的。
根据您尝试完成的操作,重新构建代码以将查询结果分配给实例变量,或者在查询完成时实现回调,该回调将根据结果执行您想要的操作。