2014-11-20 2 views
0

В RestKit можно использовать идентификационные атрибуты, которые на самом деле не являются частью ответа JSON?RestKit - использовать идентификационные атрибуты, которые не являются частью ответа

Мой случай следующее - у меня есть сервис, который перечисляет все статьи для вошедшего в данный момент пользователя, как http://example.com/json/articles.json

Моя проблема заключается в следующем - поскольку приложение позволяет нескольким пользователям для входа, я держу статьи в базе данных вместе с userId для каждой статьи. Если я установил articleMapping.identificationattributes = @["articleId"], тогда у меня возникнет проблема, если два пользователя, использующие устройство, имеют одну и ту же статью - они будут перезаписаны независимо от userId, потому что они не являются частью ответа.

Суммируя факты:

  • для запроса JSON не отправить идент, она является частью сеанса сервера только, так что я думаю, что я не могу использовать RKRoute
  • я отображение статьи с пользователем вручную после отображения RestKit.
  • У меня нет свойства userId как часть ответа JSON, оно существует только внутри объекта ArticleManagedObject.

Есть ли способ сообщить RestKit, что во время сопоставления он должен проверить комбинацию articleId+userId как идентификатор? Я пробовал использовать идентификациюPredicate без успеха.

EDIT:

Пример ответа от сервера, когда UserA вошел в:

{ 
    "data":{ 
     "articles":[ 
     { 
      "articleId":1, 
      "title":"Objective C Basics" 
     }, 
     { 
      "articleId":2, 
      "title":"Xcode Basics" 
     } 
     ] 
    } 
} 

и вот ответ, когда UserB регистрируется в:

{ 
    "data":{ 
     "articles":[ 
     { 
      "articleId":1, 
      "title":"Objective C Basics" 
     }, 
     { 
      "articleId":3, 
      "title":"Java Basics" 
     } 
     ] 
    } 
} 

Если UserA входит в систему, все в порядке. Но если UserB входит в систему с одного и того же устройства, то статья 1 сопоставляется с UserB, и с этого момента соединение между UserA и статьей 1 теряется.

Как я понимаю из вашего предложения, единственное решение - вернуть также идентификатор пользователя из службы, установить RKUnionAssignmentPolicy и позволить RestKit заботиться о сопоставлении (в настоящее время я вручную делаю сопоставление между статьями и пользователями после RestKit) ,

Другой вопрос, который у меня есть, - это возможность установить идентификационные атрибуты или идентификационный файл, чтобы он делал разделение между предметной статьей 1 для объекта UserA и объектом 1 для UserB.

+0

Являются ли статьи для каждого пользователя (с тем же идентификатором) одинаковыми? Можете ли вы просто использовать отношения «многие»? – Wain

+0

Отношение пользователя к статье «много ко многим», но служба возвращает только статьи для текущего пользователя сеанса. Мое отношение между пользователем и статьей можно назвать «isReading» для лучшего понимания. Многие пользователи могут читать одну и ту же статью, и один пользователь может читать много статей. – o15a3d4l11s2

+0

Взгляните на http://stackoverflow.com/questions/20162007/restkit-2-0-mapping-second-entitiy-nil-when-not-unique и посмотрите, помогает ли это – Wain

ответ

0

В настоящее время вы делаете пользователя для сопоставления статей за пределами RestKit, это прекрасно, но вам нужно немного изменить этот процесс.

Для начала я предполагаю, что ответ статьи представляет собой полный набор статей для пользователя. Если нет, тогда все становится более сложным, и вам нужно будет изменить приведенное ниже на счет:

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

Поскольку мы перебираем полученные статьи, мы можем проверить существующие статьи для соответствия, если мы найдем один, который у нас не будет работать. Если мы не найдем соответствия, нам нужно добавить отношение к существующему набору, который будет объединен с любым отношением к любому другому пользователю.

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

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