首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套查询完成时返回的BFTask

嵌套查询完成时返回的BFTask
EN

Stack Overflow用户
提问于 2016-01-03 05:34:13
回答 3查看 446关注 0票数 3

我正在结合BFTask和解析器执行查询。任务中有一个嵌套查询。我希望仅当外部查询完成获取必要的数据以添加到complete (包括由内部查询获取的数据)时才返回任务。我已经使用主线程实现了一个解决方案,但是我不想阻塞用户界面。

代码语言:javascript
复制
+ (BFTask*)theTask {      
    BFTask *task = [BFTask taskFromExecutor:[BFExecutor defaultExecutor] withBlock:^id{
        NSMutableArray *complete = [NSMutableArray new]; //do not return complete until it has been populated by relationObj's
        [[QueryLibrary queryA] findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
            for(PFObject *obj in objects) {
                PFQuery *relationQuery = [obj relationForKey:@"aRelation"].query;

                [relationQuery findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
                    for(PFObject *relationObj in objects) {
                        //inspect and possibly augment relationObj...
                        [complete addObject: relationObj];
                    }    
                }];
            }
        }];
        return complete;
    }];

    return task;
} 

我已经尝试重新构造我的查询(queryA),以包括关系。当尝试包含关系时,我得到以下错误:

代码语言:javascript
复制
+ (PFQuery *)queryA {
    PFQuery *query = [PFQuery queryWithClassName:@"aPFObjectSubclass"];
    //include other qualifiers...
    [query includeKey:@"aRelation"]; //[Error]: field aRelation cannot be included because it is not a pointer to another object (Code: 102, Version: 1.11.0)
    [query whereKeyExists:@"aRelation"]; // [Error]: Unsupported query operator on relation field: aRelation (Code: 102, Version: 1.11.0)

    return query;
}
EN

回答 3

Stack Overflow用户

发布于 2016-01-10 11:43:05

在您的场景中,是否可以在第一个查询时调用[query includeKey:'aRelation'];

这将使它返回aRelation对象,而不必在循环中运行relationQuery,这将完全消除在主线程上执行此操作的问题。

更多信息:http://blog.parse.com/announcements/queries-for-relational-data/

票数 1
EN

Stack Overflow用户

发布于 2016-01-12 22:39:08

在.h文件中声明typedef void(^ completion)(NSMutableArray *);

您的方法的实现应如下所示:

代码语言:javascript
复制
+ (BFTask *)theTask:(completion) completion {
  BFTask *task = [BFTask taskFromExecutor:[BFExecutor defaultExecutor] withBlock:^id{
    NSMutableArray *complete = [NSMutableArray new]; //do not return complete until it has been populated by relationObj's
    [[QueryLibrary queryA] findObjectsInBackgroundWithBlock:^(NSArray * _Nullable topObjects, NSError * _Nullable error) {
        for(PFObject *obj in topObjects) {
            PFQuery *relationQuery = [obj relationForKey:@"aRelation"].query;

            [relationQuery findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
                for(PFObject *relationObj in objects) {
                    //inspect and possibly augment relationObj...
                    [complete addObject: relationObj];
                }


                if([topObjects lastObject] == obj) {
                    completion(complete);
                }

            }];
        }
    }];
  }];

  return task;
}

调用你的方法:

代码语言:javascript
复制
[myClass theTask:^(NSMutableArray * complete) {

                //use your "complete" array

}];
票数 0
EN

Stack Overflow用户

发布于 2016-01-17 07:57:21

我想知道这是否行得通:

代码语言:javascript
复制
+ (BFTask *)theTask 
{      
  BFTask *task = [BFTask taskFromExecutor:[BFExecutor executorWithOperationQueue:[NSOperationQueue defaultQueue]] withBlock:^id {
    NSArray *objectsWithRelations = [[QueryLibrary queryA] findObjects];
    NSMutableArray *subqueries = [NSMutableArray array];            
    for(PFObject *object in objectsWithRelations) {
        [subqueries addObjects:[obj relationForKey:@"aRelation"].query];
    }
    PFQuery *query = [PFQuery orQueryWithSubqueries:subqueries];
    NSArray *complete = [query findObjects];
    return complete;
  }];

  return task;
}

在BFTask调度到的线程上,findObject调用可能是同步的,而不是在主线程上调度。

在任何情况下,您都可以通过将关系查询合并为一个OR查询来减少finds的数量。

更新:

这是否允许您仅同步运行任务的一部分:

代码语言:javascript
复制
+ (BFTask *)theTask 
{      
    NSArray *objectsWithRelations = [[QueryLibrary queryA] findObjects];
    NSMutableArray *subqueries = [NSMutableArray array];            
    for(PFObject *object in objectsWithRelations) {
        [subqueries addObjects:[obj relationForKey:@"aRelation"].query];
    }
    PFQuery *query = [PFQuery orQueryWithSubqueries:subqueries];
    return [query findObjectsInBackground];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34570953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档