3

BFTaskParseと組み合わせてクエリを実行しています。タスク内には、ネストされたクエリがあります。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;
}

findObjectBFTask がディスパッチされるスレッドで呼び出しが同期され、メイン スレッドにはディスパッチされない可能性があります。

いずれにせよ、findsリレーションシップ クエリを 1 つの 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 に答える