Как сериализовать объект NSPredicate? - PullRequest
2 голосов
/ 07 ноября 2010

Есть ли способ проверить объект NSPredicate с целью его сериализации в URL?Я пытаюсь получить данные удаленно, и мне нужно преобразовать объект предиката в URL-адрес с параметрами строки запроса, которые понимает сервер.

Это было вдохновлено выступлением в WWDC 2010 под названием «Построение опыта пользователя на сервере»«где докладчики говорят об использовании Core-Data и серверной части.Я проследил за сеансом видео и слайдов, но застрял на месте сериализации.Например, есть объект Person, и я пытаюсь выбрать всех людей, чье имя «Джон».Я использую подкласс NSManagedObjectContext, называемый RemoteManagedObjectContext, который переопределяет метод executeFetchRequest и вместо этого должен отправлять вызов на сервер.Запрос на выборку создается как (эллиптические несущественные части):

@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

1 Ответ

4 голосов
/ 13 ноября 2010

Даже лучше, чем строковое представление, это объектно-ориентированное представление!И это делается автоматически!

Сначала проверьте класс NSPredicate.Это будет NSCompoundPredicate.Приведите его к соответствующей переменной.

Затем вы увидите, что compoundPredicateType равно NSAndPredicateType, как вы и ожидали.

Вы также можете увидеть, что массив возвращается-subpredicates показывает 2 NSComparisonPredicates.

Первый субпредикат имеет левое выражение типа NSKeyPathExpressionType и -keyPath из @"name", оператор - NSEqualToPredicateOperatorType.Правым выражением будет NSExpression типа NSConstantValueExpressionType, а -constantValue будет @"John".

Второй субпредикат будет аналогичным, за исключением того, что keyPath левого выражения будет @"endpoint", а правильное выражение constantValue будет @"people".

Если вы хотите получить более подробную информацию о превращении NSPredicates в запрос HTTP Get, ознакомьтесь с моей StackOverflow framework"StackKit" , который делает именно это.Это в основном фреймворк, который ведет себя подобно CoreData, но использует StackOverflow.com (или любой другой сайт обмена стека) для получения информации.Ниже он делает lot для преобразования NSPredicate объектов в URL.Вы также можете отправить мне по электронной почте любые ваши конкретные вопросы.

...