Добавьте это в категорию к NSMutableArray:
- (void) invertArray{
NSUInteger operationCount = self.count / 2;
NSUInteger lastIndex = self.count - 1;
id tmpObject;
for (int i = 0; i < operationCount; i++){
tmpObject = [self objectAtIndex:i];
[self replaceObjectAtIndex:i withObject:[self objectAtIndex:lastIndex - i]];
[self replaceObjectAtIndex:lastIndex - i withObject:tmpObject];
}
}
Это инвертирует массив без создания какого-либо нового массива.Более того, он достаточно эффективен, ему нужно только выполнить итерацию по половине массива.
Если вам нужно упорядочить tableView при перестановке массива, используйте этот метод (снова как категория для NSMutableArray):
- (void) invertArrayWithOperationBlock:(void(^)(id object, NSUInteger from, NSUInteger to))block{
NSUInteger operationCount = self.count / 2;
NSUInteger lastIndex = self.count - 1;
id tmpObject1;
id tmpObject2;
for (int i = 0; i < operationCount; i++){
tmpObject1 = [self objectAtIndex:i];
tmpObject2 = [self objectAtIndex:lastIndex - i];
[self replaceObjectAtIndex:i withObject:tmpObject2];
[self replaceObjectAtIndex:lastIndex - i withObject:tmpObject1];
if (block){
block(tmpObject1, i, lastIndex - i);
block(tmpObject2, lastIndex - i, i);
}
}
}
Это позволит вам передать блок методу для выполнения кода для каждого перемещения.Вы можете использовать это для анимации строк в табличном представлении.Например:
[self.tableView beginUpdates];
[array invertArrayWithOperationBlock:^(id object, NSUInteger from, NSUInteger to){
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:from inSection:0] toIndexPath:[NSIndexPath indexPathForRow:to inSection:0];
}];
[self.tableView endUpdates];