Разбор - Использование отношений против указателей?
Я использую 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"];