在Block内返回

时间:2014-08-17 05:48:34

标签: ios objective-c parse-platform

过去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;
  }];
}

3 个答案:

答案 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 *geoPointNSError *error

如果您对块的使用感到困惑,请参阅Apple官方文档here。如果您没有时间阅读所有关于块及其工作方式,this证明是一个有用的参考点。

答案 2 :(得分:-1)

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

根据您尝试完成的操作,重新构建代码以将查询结果分配给实例变量,或者在查询完成时实现回调,该回调将根据结果执行您想要的操作。