Атрибуты искусственной идентификации iOS RestKit

связанная ошибка RestKit № 1604

Если мой API не дает мне атрибут id, но я все еще хочу кэшировать объекты через Core Data, что мне следует использовать для идентификации моего объекта. например у меня есть

response =  {
  translation =     {
          text = "longlongtext";
          dictionary = "general";
          lang = "en";
      };
  otherdata =     {
          author = "May";
          date = "434134";
      };
}

Поэтому я был бы рад использовать хешированный (md5) текст перевода в качестве строки идентификатора. Обратите внимание, что мои будущие запросы, которые выполняются без подключения к сети, должны иметь возможность идентифицировать этот кэшированный объект и выдавать его в результате.

Я не могу объявить сопоставление для заполнения свойства responseID из [translation.text md5hash] для использования в качестве responseMapping.identificationAttributes = @[ responseID ];, потому что сопоставления не имеют такой функции.


person Baca6u    schedule 18.09.2013    source источник
comment
Значит, вас действительно беспокоит сопоставление существующих данных для автономных запросов?   -  person Wain    schedule 18.09.2013
comment
@Wain да, это то, что меня действительно волнует.   -  person Baca6u    schedule 19.09.2013


Ответы (4)


Как было предложено @segiddins в обсуждении проблемы github:

... в своем подклассе управляемого объекта подключитесь к одному из основных обратных вызовов данных, чтобы сгенерировать составной ключ, который сохраняется как часть модели, и просто используйте этот ключ в качестве своего идентификационного атрибута.

Подход может выглядеть так:

@property (nonatomic, copy) NSString *identifier;


- (void)willSave
{
    [super willSave];

    NSString *computedIdentifier = [[NSString stringWithFormat:@"%@%@", self.text, self.langCode] md5hash];
    [self setPrimitiveValue:computedIdentifier forKey:@"identifier"];
}
person Baca6u    schedule 02.12.2013

Я также хотел сделать хэш полей JSON, как вы, но, как вы знаете, это невозможно. В итоге я сделал следующее, чтобы достичь (я считаю) того же конечного результата, что и для объектов JSON, возвращаемых без уникального идентификатора, RestKit генерирует уникальный идентификационный атрибут:

    entityMapping.identificationAttributes = @[ @"text",@"dictionary",@"lang",@"author",@"date" ];
person herrtim    schedule 16.11.2013

Вы должны сохранить такую ​​​​функциональность вне RestKit, если у вас нет идентификаторов, предоставляемых сервером.

Я бы сгенерировал собственный идентификатор для каждого вашего запроса (GUID), я бы сохранил этот идентификатор в каждом из объектов результата в блоке успешного завершения RestKit. Я бы также сохранил детали запроса и идентификатор в пользовательских настройках по умолчанию.

Теперь, когда пользователь делает запрос и находится в автономном режиме, вы можете проанализировать пользовательские значения по умолчанию, чтобы определить, является ли это повторным запросом, и найти идентификатор, с помощью которого можно запросить результаты из хранилища данных.

person Wain    schedule 19.09.2013
comment
Спасибо за ответ. Это имеет большой смысл. Но хочу уточнить: я просмотрел ресурсы: - person Baca6u; 19.09.2013
comment
Я просмотрел ресурсы: github.com/RestKit/RestKit/wiki/Object-mapping restkit.org/api/latest/Classes/ и чему я научился заключалась в том, что если я использую запеченные сопоставления Core Data, я получаю автономную поддержку из коробки. Итак, если мой пользователь включил режим полета и инициировал [self.objectManager getObjectsAtPath:TRANSLATE_PATH parameters:queryParams success:<...> failure:<...> ]; - person Baca6u; 19.09.2013
comment
Он все еще получает результаты как-то. - person Baca6u; 19.09.2013
comment
Но я могу предположить, что это нереально, потому что невозможно предположить, какую сущность извлекать из Core Data, зная только путь запроса. - person Baca6u; 19.09.2013
comment
Итак, я попытаюсь реализовать то, что вы предложили. - person Baca6u; 19.09.2013
comment
Еще одна вещь: что, если я использую translation.text в качестве атрибута идентификации для объекта CoreData с именем Response. Получу ли я автономный режим из коробки? - person Baca6u; 19.09.2013
comment
Хорошо, я думаю, RestKit регистрирует идентификаторы управляемых объектов для внутреннего запроса, если это работает. Я не знал об этой функции... - person Wain; 19.09.2013
comment
В конце концов, внутри RestKit такой возможности (автономных запросов) нет. Способ достижения этого сложен, но возможен. - person Baca6u; 24.02.2014

Просто чтобы уточнить про офлайн-запросы после обсуждения. В конце концов, внутри RestKit такой возможности (автономных запросов) нет. Способ достижения этого сложен, но возможен. Шаги:

  • вы используете CoreData с RestKit (RKEntityMapping, управляемые объекты и т. д.)
  • Вы предоставляете хорошие идентификационные атрибуты для сущностей. Это может быть URL запроса от @metadata.
  • при обратных вызовах success и failure из getObjectsAtPath вы запрашиваете CoreData с запросом на выборку и возвращаете результат точно так же, как если бы он был загружен напрямую и взят из mappingResult.firstObject и помечен как кэшируется, если старый результат загружается при ошибке.
person Baca6u    schedule 24.02.2014