3

我正在BFTask与 Parse 一起执行查询。任务内是一个嵌套查询。我希望仅在外部查询完成获取要添加的必要数据complete(包括内部查询获取的数据)后才返回任务。我已经使用主线程实现了一个解决方案,但是我不想阻止用户界面。

+ (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) 以包含该关系。尝试包含关系时,出现以下错误:

+ (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;
}
4

3 回答 3

1

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

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

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

于 2016-01-10T03:43:05.313 回答
0

我想知道这是否可行:

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

调用将有findObject可能在 BFTask 被分派到的线程上是同步的,而不是被分派到主线程上。

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

更新:

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

+ (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];
}
于 2016-01-16T23:57:20.547 回答
0

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

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

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

调用你的方法:

[myClass theTask:^(NSMutableArray * complete) {

                //use your "complete" array

}];
于 2016-01-12T14:39:08.477 回答