Я использую Parse в качестве моего бэкэнд. Сохранение/выборка объектов выполняется в отдельном потоке от основного потока, так что если вы делаете что-либо с данными, вы пытаетесь принести, вы должны сделать это в справочном блоке, как это:Objective-C - добавить объект к NSMutableArray по определенному индексу
[Card fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
...
//setting up button based on Card's name
...
[buttonArray addObject:button];
}];
Это создает новый поток, и когда объект был извлечен из Parse, выполняется код внутри блока.
Я добавляю кнопку для каждого объекта Карты из массива карт, прикрепленных к пользователю синтаксического анализа. Когда вы нажимаете кнопку карты, вы можете увидеть некоторую информацию об этом, а также выбрать ее удаление. Я выполняю размотку segue, которая обрабатывает удаление кнопки для удаленной карты, а также перемещение любых кнопок под удаленным, поэтому нет пробелов. Моя проблема в том, что, поскольку кнопки создаются и добавляются в мой массив внутри другого потока, некоторые объекты могут быть извлечены из строя. Таким образом, мой экран может отображать кнопки в порядке 1 2 3 4, но мой массив удерживает кнопки [3,2,1,4]. Как я могу убедиться, что сохраняю кнопки в массиве в том же порядке, что и на экране, что является тем же самым порядком, что карты хранятся в моем массиве Parse?
Вот как я удаление кнопок в настоящее время, которая движется неправильные кнопки:
-(IBAction)prepareForUnwindPaymentCardDeleted:(UIStoryboardSegue *)segue
{
[buttonArray removeObjectAtIndex:cardNum];
for(int i = cardNum; i < [buttonArray count]; i++)
{
UIButton *button = [buttonArray objectAtIndex:i];
[button setTag:i];
[button setFrame:CGRectMake(xCenter-width/2, button.frame.origin.y - 52, width, height)];
}
yValue -= 52;
}
yValue является у-координату происхождения кнопки, и соответствует координате у, что следующая кнопка должна быть помещена в если я добавлю новую карту/кнопку. Следовательно, когда я удаляю кнопку/карту, я уменьшаю yValue, поэтому я не оставляю промежуток между текущей текущей кнопкой и новой кнопкой. cardNum - это переменная, которая равна индексу карты в моем массиве Parse и также является указателем кнопки в том порядке, в котором она появляется. Тем не менее, я обнаружил, что это не всегда индекс кнопки внутри buttonArray.
Что я хочу для моего NSMutableArray buttonArray, чтобы его индексы соответствовали порядку появления на экране кнопок, поэтому, если я удаляю кнопку 3, мне нужно сдвинуть кнопки 4-n до заполнения пробела, затем уменьшите каждый из их тегов, чтобы соответствовать правильной карте.
Редактировать - Моим решением оказалось просто создать кнопку и добавить ее в мой массив до вызова fetchinbackground. Таким образом, все добавлялось в том порядке, который я ожидал. Я неправильно использовал метод insertObjectAtIndex, но поскольку я добавлял к индексу равный счету, он не вызывал ошибок. Когда я узнаю немного больше о них, вместо этого я буду использовать NSMutableDictionary, как было предложено Джошем и Дунканом.
Тег Parse не нужен и не связан с ним по существу. Я добавляю асинхронный тег, который более подходит. – nhgrif
1) Собственно прочитайте спецификацию для NSMutableArray. 2) Узнайте о синхронизации в Objective-C. –
Возможный дубликат [Добавление объекта по определенному индексу NSMutableArray] (http://stackoverflow.com/questions/5137359/adding-an-object-at-a-specific-index-of-an-nsmutablearray) – nhgrif