2015-12-06 2 views
-1

Я использую 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.

+0

Это pftableviewcontroller? – Wain

+0

Да, это подкласс PFQueryTableViewController –

+0

Почему вы сравниваете заголовок? Вы можете опустить внешний цикл и просто сказать '[arrayToShow removeObject: object2]' во втором цикле (который будет вашим единственным циклом) – Paulw11

ответ

0

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

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

+0

Все еще видя последний элемент в удаляемом массиве, а не элемент, который находится в Relation. –

+0

. Вам нужно будет объяснить больше о том, что вы делаете, о том, как вы редактируете содержимое таблицы, какие запросы вы отправляете на server – Wain

+0

Я просто хочу запросить Parse Class A, PFRelation, найти соответствующие PFObjects и удалить их из массива, который отображается в таблице на главном экране. Более подробная информация добавлена ​​выше, с моим кодом codeForTable –

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