Ios 在街区内返回

Ios 在街区内返回,ios,objective-c,parse-platform,Ios,Objective C,Parse Platform,在过去的24小时里,我一直在玩Parse。我发现PFGeoPoint功能非常强大,但是,获取当前位置大约需要1.5秒。因此,您必须在同一块操作中运行其他查询,这些查询需要当前位置作为方案中的参数 我一直在努力处理返回查询,因为该方法给出了“不兼容的块指针类型,将“PFQuery”发送到“void PFGeoPoint”类型的参数。” 有人能帮忙吗?我认为这或多或少是对有块操作经验的人来说的,不一定是解析…所以我尽了最大努力来解释这个问题 - (PFQuery *)queryForTable {

在过去的24小时里,我一直在玩Parse。我发现
PFGeoPoint
功能非常强大,但是,获取当前位置大约需要1.5秒。因此,您必须在同一块操作中运行其他查询,这些查询需要当前位置作为方案中的参数

我一直在努力处理
返回查询
,因为该方法给出了“不兼容的块指针类型,将“PFQuery”发送到“void PFGeoPoint”类型的参数。”

有人能帮忙吗?我认为这或多或少是对有块操作经验的人来说的,不一定是解析…所以我尽了最大努力来解释这个问题

- (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;
  }];
}

无法返回查询。该方法只接受返回类型为void的块。从解析文档中引用:

方法
geoPointForCurrentLocationInBackground:
接受一个参数,即一个具有void返回类型的块,它只接受两个参数<代码>PFGeoPoint*地质点和
n错误*错误


如果您对块的用法感到困惑,请参阅苹果的官方文档。如果您没有时间阅读有关块及其工作方式的所有信息,这将是一个有用的参考点。

您不能在块内返回,因为它是异步操作,而函数不是。这意味着上述代码将在另一个线程上调用geoPointForCurrentLocation,完成后运行该块。但是,对queryForTable的调用是在主线程上进行的,并且是同步的


根据您试图完成的任务,重新构造代码以将查询结果分配给实例变量,或者在查询完成时实现回调,以处理结果。

您需要重写逻辑。您不能期望
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
}];
我想您需要深入了解一些模块来理解实现。
苹果在这方面做得很好。

我本人从未使用过解析框架,但从文档中我了解到,该方法用于获取
PFGeoPoint
对象。如果要处理此对象,请将其存储在变量或数组中以供以后使用,例如在查询中。编译器错误是因为尝试从块返回时,其推断类型将更改为不再匹配
-geoPointForCurrentLocationInBackground:
(如Vatsal所述)接受的类型。但是,概念上的错误是,您将
-queryForTable
设计为一个尝试返回值的同步方法,但它依赖于一个异步API,该API在未定义的未来时间之前没有提供值。由于这种逻辑,异步性倾向于在程序中传播。
-queryForTable
的调用者将如何处理结果?您需要在块中执行此操作。但是,根据解析文档,我必须在queryForTable中返回查询,以便它们的子类能够工作。您指的是哪个子类?