iOS indexOfObjectIdenticalTo: проблема - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть два массива, каждый из которых содержит строки. Первый массив представляет собой список слов, второй массив содержит альтернативы этим словам на разных языках.

Массивы сопоставляются таким образом, что слово с индексом n во втором массиве является переводом слова с индексом n в первом массиве.

Слова и их переводы отображаются в виде таблицы. Пользователь может отфильтровать представление таблицы, введя текст в поле поиска. Когда это будет сделано, я создаю отфильтрованный массив из первого массива следующим образом:

- (void)filterContentForSearchText:(NSString*)searchText

[self.filteredarray removeAllObjects]; 
[firstarray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
 {
     if ([obj compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])] == NSOrderedSame)
     {
         idx= [firstarray indexOfObjectIdenticalTo:obj];
         NSUInteger maxindex = idx + 50;
         for (idx ; (idx < [firstarray count] && idx <= maxindex && idx!= NSNotFound); idx ++)
         {
             [self.filteredarray addObject:[firstarray objectAtIndex: idx]];
         }
         *stop = YES;
     }
 }];     

Затем, когда я отображаю значения в моем табличном представлении, я использую следующий код. Это отрывок из моего метода cellForRowAtIndexPath. Я пытаюсь получить индекс из исходного массива, используя объект, который был добавлен в фильтруемый массив.

contentForThisRow = [self.filteredarray objectAtIndex:row];
NSUInteger index = [self.firstarray indexOfObjectIdenticalTo:contentForThisRow];
contentForThisRow2 = [self.secondarray objectAtIndex:index];

Это работает на симуляторе, но на устройстве я иногда получаю повторы той же записи из второго массива. Например, мой первый массив содержит слово «привет» три раза подряд с индексами x, y и z. Мой второй массив содержит «hei», «heisan» и «hoppsan», которые все являются переводами «hello», в индексах x, y и z.

На симуляторе я получаю три ячейки, каждая с разным переводом. На устройстве я получаю три ячейки, все с "хей", первый перевод. Это не происходит для всех повторных переводов.

Почему это происходит, и как я могу обойти это?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Я думаю, что проблема в том, что iOS (на устройстве) может использовать немного другую оптимизацию, чем где-либо в эмуляторе, либо в NSString, либо в NSArray.Это предположение.

indexOfObjectIdenticalTo: возвращает индекс первого объекта, который имеет тот же адрес памяти, что и объект, который вы передаете. На телефоне он, кажется, повторно использовал идентичные строковые объекты в вашем первом массиве при построениифильтруемый массив (возможно, даже при построении firstArray), поэтому вы каждый раз получаете одно и то же значение индекса.

Лучшим решением было бы построить отфильтрованный массив в виде массива словарей, сохраняя значения из правильных индексов firstArray и secondArray в этой точке.Затем вы можете использовать эти значения непосредственно при заполнении ячейки вместо повторного поиска в обоих массивах.Это также должно иметь некоторые преимущества в производительности.

Этого можно добиться, используя следующий код.Сначала, внутри вашего цикла, когда вы создаете фильтрованный массив, вместо добавления объекта из firstarray, сделайте следующее:

[self.filteredArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:[firstarray objectAtIndex:idx],@"english",[secondarray objectAtIndex:idx],@"translated",nil];

Затем, в вашем cellForRowAtIndexPath, получите две переменные содержимого:

NSDictionary *rowData = [self.filteredarray objectAtIndex:row];
contentForThisRow = [rowData objectForKey:@"english"];
contentForThisRow2 = [rowData objectForKey:@"translated"];

Лучшим решением для и даже было бы, в первую очередь, хранить ваши данные, а не пытаться синхронизировать два отдельных массива.Я полагаю, что если вы хотите добавить или изменить что-либо в ваших двух отдельных файлах, вы можете быстро вывести их из строя.Тем не менее, я чувствую, что сделал достаточно для дня ...

0 голосов
/ 03 ноября 2011
else

contentForThisRow = [self.firstarray objectAtIndex:row];
contentForThisRow2 = [self.secondarray objectAtIndex:row];

Вы видите что-то не так с этим?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...