2010-11-07 3 views
2

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

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

@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

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

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

Вы увидите, что это compoundPredicateType is , как и ожидалось.

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

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

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

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

Смежные вопросы