2

URL にシリアル化する目的で NSPredicate オブジェクトを検査する方法はありますか? リモートでデータを取得しようとしており、述語オブジェクトを、サーバーが理解できるクエリ文字列パラメーターを持つ URL に変換する必要があります。

これは、WWDC 2010 で行われた「Building a Server Driven User EXperience」と呼ばれる講演に触発されたもので、講演者は Core-Data とサーバー バックエンドの使用について話しています。セッションのビデオとスライドをたどりましたが、連載のポイントで立ち往生しています。たとえば、Personオブジェクトがあり、名前が「John」であるすべての人を取得しようとしています。メソッドをオーバーライドするNSManagedObjectContextcalledのサブクラスを使用しており、代わりに呼び出しをサーバーに送信することになっています。フェッチ リクエストは次のように作成されます (省略された重要でない部分):RemoteManagedObjectContextexecuteFetchRequest

@implementation PeopleViewController

- (NSArray *)getPeople {
    RemoteFetchRequest *fetchRequest = [[RemoteFetchRequest alloc] init];
    NSEntityDescription *entity = ...
    NSPredicate *template = [NSPredicate predicateWithFormat:
                                @"name == $NAME AND endpoint = $ENDPOINT"];
    NSPredicate *predicate = [template predicateWithSubstitutionVariables:...];

    [fetchRequest setEntity:entity];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    // the custom subclass of NSManagedObjectContext executes this
    return [remoteMOC executeFetchRequest:fetchRequest error:&error];
}

@end

のカスタム サブクラス内でNSManagedObjectContext、フェッチ要求をサーバーに適したクエリ文字列パラメーターにシリアル化するにはどうすればよいでしょうか。したがって、上記のフェッチ リクエストの場合、対応する URL は次のようになります。

http://example.com/people?name=John

返される述語の文字列表現を取得することが可能です。

name == "John" AND endpoint == "people"

パラメータを取得するために解析できることname、およびendpoint. しかし、文字列を解析せずにそれを行うことは可能ですか? RemoteManagedObjectContextクラスの部分的な実装を次に示します。

@implementation RemoteManagedObjectContext

- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error {
    // this gives name == "John" AND endpoint == "people"
    // don't know how else to retrieve the predicate data
    NSLog(@"%@", [[request predicate] predicateFormat]);

    ...
}

@end
4

1 に答える 1

4

文字列表現よりもさらに優れているのは、オブジェクト指向の表現です。そして、それは自動的に行われます!

まず、のクラスを確認しNSPredicateます。になりますNSCompoundPredicate。適切な変数にキャストします。

予想どおり、それcompoundPredicateTypeがであることがわかります。NSAndPredicateType

-subpredicatesまた、によって返される配列が2を明らかにすることもわかりますNSComparisonPredicates

最初のサブ述語には、型の左式NSKeyPathExpressionTypeとのa-keyPath@"name"あり、演算子はNSEqualToPredicateOperatorTypeです。正しい式はNSExpressionタイプNSConstantValueExpressionTypeのであり、-constantValueはです@"John"

2番目のサブ述語も同様ですが、左の式keyPath@"endpoint"、であり、右の式が。である点が異なりconstantValueます@"people"

HTTP Getリクエストへの変換に関するより詳細な情報が必要な場合は、 StackOverflowフレームワーク「StackKit」NSPredicatesをチェックしてください。これはまさにそれを実行します。これは基本的にCoreDataと同様に動作するフレームワークですが、StackOverflow.com(またはその他のスタック交換サイト)を使用して情報を取得します。その下では、オブジェクトをURLに変換するために多くのことを行っています。また、ご不明な点がございましたら、メールでお問い合わせください。NSPredicate

于 2010-11-13T06:42:50.363 に答える