Есть ли способ проверить объект 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