我正在结合BFTask和解析器执行查询。任务中有一个嵌套查询。我希望仅当外部查询完成获取必要的数据以添加到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;
}发布于 2016-01-10 11:43:05
在您的场景中,是否可以在第一个查询时调用[query includeKey:'aRelation'];?
这将使它返回aRelation对象,而不必在循环中运行relationQuery,这将完全消除在主线程上执行此操作的问题。
更多信息:http://blog.parse.com/announcements/queries-for-relational-data/
发布于 2016-01-12 22:39:08
在.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-17 07:57:21
我想知道这是否行得通:
+ (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的数量。
更新:
这是否允许您仅同步运行任务的一部分:
+ (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];
}https://stackoverflow.com/questions/34570953
复制相似问题