2013-11-19 2 views
1

Я хочу сохранить PFObjects из запроса Parse в NSMutableArray, который мой класс вызвал listdata. Позднее я буду использовать массив listdata. Когда я отслеживал свой код, он обновлял массив highScoreObjects для каждого найденного объекта. Но когда я пытаюсь установить массив listdata в массив highScoreObjects, массив highScoreObjects пуст. Есть ли способ сохранить данные после завершения запроса?Сохранить PFObjects из Parse Query

NSMutableArray *highScoreObjects = [[NSMutableArray alloc] initWithCapacity:5]; 

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      // The find succeeded. 
      NSLog(@"Successfully retrieved %d scores.", objects.count); 
      // Do something with the found objects 
      for (PFObject *object in objects) { 
       [highScoreObjects addObject:object]; 
       NSLog(@"%@", object.objectId); 
      } 
      dispatch_async(dispatch_get_main_queue(),^{ 
       [self.tableView reloadData]; 
      }); 
     } else { 
      // Log details of the failure 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
    }]; 

self.listData = highScoreObjects; 

Я также попытался держать линию self.listData = highScoreObjects; внутри цикла self.listData = highScoreObjects;. Это не имело никакого значения.

ответ

2

Это не значит, что он не установлен. Это то, что он еще не установлен . Это связано с тем, что вы используете findObjectsInBackgroundWithBlock, и асинхронный процесс еще не завершен.

Переместите свое назначение (self.listData = highScoreObjects;) в блок, перед отправкой запроса на перезагрузку табличного вида.

+1

Чтобы быть в безопасности, поскольку highScoreData изменен, я бы удостоверился, что self.listData является копией highScoreData. Если вы когда-либо передадите highScoreData где-то еще, и этот код изменит его, будет также изменен self.listData. Это было бы разочаровывающей ошибкой отслеживать год спустя. –

+0

Я удивлен, что ответ еще не принят ... –

0

Это еще один случай не понимания природы асинхронного программирования.

Рассмотрим такую ​​ситуацию:

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

Ваш звонок findObjectsInBackgroundWithBlock ставит яйца на кипение. Блок, который вы передаете, это сигнал тревоги и то, что вы планируете делать с яйцами, которые когда-то были приготовлены.

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

Решение заключается в вызове метода в конце блока вашего прохода к методу.