Я использую Parse.com
как бэкэнд моего приложения.NSMutableArray выводит неверные данные
У каждого пользователя есть доступ к списку PFObjects
. Если текущий пользователь хочет «любить» объект, который я хотел бы удалить из основного списка для текущего пользователя.
Ниже мой код, пробег в ObjectsDidLoad
.
Если я выйти ниже кода, PFObject
, который находится в PFRelation
удаляется, но в моем UITableView
последний элемент в NSMutableArray
удаляется.
Я выполняю это в неправильном месте?
Возможно, отсутствует шаг?
Спасибо!
Вот код:
- (void)objectsDidLoad:(NSError *)error {
[super objectsDidLoad:error];
PFRelation *relation = [[PFUser currentUser] relationForKey:@"myRelation"];
PFQuery *relationQuery = relation.query;
[relationQuery findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
NSMutableArray *arrayToShow = [NSMutableArray arrayWithArray:self.objects];
for (PFObject *object1 in self.objects) {
for (PFObject *object2 in results) {
if ([[object1 objectForKey:@"title"] isEqualToString:[object2 objectForKey:@"title"]]) {
[arrayToShow removeObject:object1];
}
}
}
self.objectsToShowArray = [NSMutableArray arrayWithArray:arrayToShow];
[self.tableView reloadData];
}];
}
Подробнее Описание:
Таблица A, или основная таблица, загружает все объекты в классе Разбор. У каждого пользователя будет доступ к этому.
Пользователь выбирает объект для перехода к другому контроллеру представления и может нажать кнопку, чтобы добавить его в другой класс анализа. Это также создает PFRelation.
Так что если пользователь добавляет объект «xyz» в Parse Class B и таблицу B, я хочу, чтобы этот объект не отображался в таблице A для них (хотя он должен оставаться в Parse Class A, поскольку каждый пользователь имеет доступ к этому).
Итак, я хочу, чтобы запросить по Разбор класса А, запрос на PFRelation, и удалить соответствующие объекты из массива, который отображается на таблице А.
Вот мой метод queryForTable:
- (PFQuery *)queryForTable {
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
[query orderByAscending:@"title"];
// **********************************
// PFRelation
PFRelation *relation = [[PFUser currentUser] relationForKey:@"myRelation"];
PFQuery *relationQuery = relation.query;
[relationQuery findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
NSMutableArray *arrayToShow = [NSMutableArray arrayWithArray:self.objects];
for (PFObject *object1 in self.objects) {
for (PFObject *object2 in results) {
if ([[object1 objectForKey:@"title"] isEqualToString:[object2 objectForKey:@"title"]]) {
[arrayToShow removeObject:object1];
}
}
}
self.objectsToShowArray = [NSMutableArray arrayWithArray:arrayToShow];
[self.tableView reloadData];
}];
// **********************************
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSObject * object = [prefs objectForKey:@"category"];
if(object != nil){
//object is there
self.categoryString = [NSString stringWithFormat:@"%@", object];
[query whereKey:@"category" equalTo:self.categoryString];
}
// A pull-to-refresh should always trigger a network request.
[query setCachePolicy:kPFCachePolicyNetworkOnly];
// If no objects are loaded in memory, we look to the cache first to fill the table
// and then subsequently do a query against the network.
//
// If there is no network connection, we will hit the cache first.
if (self.objects.count == 0 || ![[UIApplication sharedApplication].delegate performSelector:@selector(isParseReachable)]) {
[query setCachePolicy:kPFCachePolicyCacheThenNetwork];
}
return query;
}
Еще одна попытка:
- (PFQuery *)queryForTable {
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
[query orderByAscending:@"title"];
// **********************************
// PFRelation Query
PFRelation *relation = [[PFUser currentUser] relationForKey:@"myRelation"];
PFQuery *relationQuery = relation.query;
[relationQuery findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
PFQuery *theQuery = [PFQuery queryWithClassName:self.parseClassName];
[theQuery whereKey:@"title" matchesKey:@"title" inQuery:relationQuery];
[theQuery findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
NSMutableArray *arrayToShow = [NSMutableArray arrayWithArray:self.objects];
for (PFObject *object1 in self.objects) {
for (PFObject *object2 in objects) {
if ([[object1 objectForKey:@"title"] isEqualToString:[object2 objectForKey:@"title"]]) {
[arrayToShow removeObject:object1];
}
}
}
self.objectsToShowArray = [NSMutableArray arrayWithArray:arrayToShow];
[self.tableView reloadData];
}];
}];
// **********************************
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSObject * object = [prefs objectForKey:@"category"];
if(object != nil){
//object is there
self.categoryString = [NSString stringWithFormat:@"%@", object];
[query whereKey:@"category" equalTo:self.categoryString];
}
// A pull-to-refresh should always trigger a network request.
[query setCachePolicy:kPFCachePolicyNetworkOnly];
// If no objects are loaded in memory, we look to the cache first to fill the table
// and then subsequently do a query against the network.
//
// If there is no network connection, we will hit the cache first.
if (self.objectsToShowArray.count == 0 || ![[UIApplication sharedApplication].delegate performSelector:@selector(isParseReachable)]) {
[query setCachePolicy:kPFCachePolicyCacheThenNetwork];
}
return query;
}
же результаты. В журнале он удаляет правильный PFObject
, но в UITableView
он удаляет последний объект. Что я не замечаю?
Подойдя ближе:
Я почти там. Я понял правильный способ получить результаты, которые хочу, но теперь мне нужно добавить еще один слой к моему запросу. Вот мой код:
PFRelation *relation = [[PFUser currentUser] relationForKey:@"myRelation"];
PFQuery *relationQuery = relation.query;
PFRelation *adoptedRelation = [[PFUser currentUser] relationForKey:@"mySecondRelation"];
PFQuery *adoptedRelationQuery = adoptedRelation.query;
PFQuery *matchQueryOne = [PFQuery queryWithClassName:self.parseClassName];
[matchQueryOne whereKey:@"title" matchesKey:@"title" inQuery:relationQuery];
PFQuery *matchQueryTwo = [PFQuery queryWithClassName:self.parseClassName];
[matchQueryTwo whereKey:@"title" matchesKey:@"title" inQuery:adoptedRelationQuery];
PFQuery *queryOne = [PFQuery queryWithClassName:self.parseClassName];
[queryOne whereKey:@"title" doesNotMatchKey:@"title" inQuery:matchQueryOne];
[queryOne whereKey:@"title" doesNotMatchKey:@"title" inQuery:matchQueryTwo];
[queryOne orderByAscending:@"title"];
Мне нужно выполнить два отношения и объединить результаты, а затем получить результат.
В этом примере удаляется только второй случай в моем запросеOne.
Это pftableviewcontroller? – Wain
Да, это подкласс PFQueryTableViewController –
Почему вы сравниваете заголовок? Вы можете опустить внешний цикл и просто сказать '[arrayToShow removeObject: object2]' во втором цикле (который будет вашим единственным циклом) – Paulw11