Разбор - Использование отношений против указателей?

Я использую Parse в качестве моего бэкэнда. У меня проблемы с настройкой правильного отношения между объектами.

У меня в основном есть класс с именем Post, каждый пост принадлежит пользователю (PFUser), и при получении поста я хочу, чтобы информация о пользователе была получена вместе с постом.

@interface Post : PFObject<PFSubclassing>

@property (nonatomic, strong) NSDate *time;
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *body;
@property (nonatomic, strong, readonly) PFRelation *user;
// User in backed is defined as a relationship to _user    

@end

// Saving the post
[post.user addObject:[PFUser currentUser];
[post saveInBackground];

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

Как правильно справиться с этим? Попытка изменить PFRelation на PFUser, но это может привести к сбою, потому что он пытается вызвать save для объекта PFUser

4 ответа

Решение

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

В основном у вас есть 4 варианта с Parse:

  • Указатель - одиночная ссылка на другой класс (от 1 до 0..1)
  • Array - коллекция указателей, загружаемых с объектом каждый раз (от 1 до 0..n, небольшие списки)
  • Отношение - совокупность указателей, например таблица соединений в SQL (для вас это обрабатывается под обложками), вы должны выполнить запрос к ней, чтобы загрузить значения (от 1 до 0..n)
  • Пользовательский класс соединения - на самом деле просто еще один объект (например, соединение "многие ко многим" в SQL) с указателем на каждую сторону плюс любая связанная информация (1..n до 1..n)

В вашем случае простой указатель будет делать то, что вы хотите.

В вашем случае указатель предпочтительнее PFRelation. Вы можете включить информацию о пользователе, добавив includeKey в свой запрос:

[query includeKey:@"user"];

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

Когда вы начинаете использовать базы данных NoSQL, легко застрять в старом SQLish. Если желателен счетчик, вы можете добавить облачный код afterSave к объекту комментария, который обновляет столбец "комментарии" класса Post, добавив указатель на сохраненный комментарий к массиву "comments" в Post. Таким образом, когда вы получаете сообщение, вы также можете использовать

[query includeKey:@"comments"];

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

Вы должны создать запрос из объекта PFRelation, как в этом фрагменте кода (взят из документации Parse), и выполнить явный запрос для получения ссылочного объекта:

[[relation query] findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (error) { // There was an error } else { // user(s) } }];

Parse предоставляет возможность извлекать также ссылочные объекты в исходном запросе, и это делается с помощью метода includeKey: в исходном запросе (то есть запросе, который вы настроили для получения сообщений), запрашивая возврат пользовательских данных и не просто ссылка. Но я не уверен, что он работает для PFRelation, так как в документации указано, что includeKey работает для PFObject, а PFRelation не является PFObject. Вы можете попробовать этот код в любом случае и посмотреть, работает он или нет:

[query includeKey:@"user"]

Создать PFSubClass как

yourClassName:PFObject with PFSubclassing 

а затем в заголовочном файле создать отношение Pointer

@property(nonatomic, strong) PFUser *userLikeRelation; 

добавить в м файл добавить

+ (NSString *)parseClassName {

    return @"parseTableName";

}

+ (void)load {

    [self registerSubclass];

} 

наконец в View Controller установить отношение в запросе, когда вы сохраняете данные в разборе.

yourClassName *yourClassNameObj = [yourClassName objectWithClassName:[yourClassName parseClassName]];

[yourClassName setUserCommentRelation:[PFUser currentUser]];

для получения данных вы можете получить данные с помощью ключа включения

[yourClassNameObj includeKey:@"NameofRelation"];
Другие вопросы по тегам