Я видел много сообщений здесь относительно этой проблемы, но никто, кажется, не решает проблему, которую я испытываю.Сортировка отношений данных ядра со многими в UITableView
У меня есть приложение, использующее данные ядра. Я пытаюсь сортировать tableView, подключенный к NSFetchedResultsController, что делает проблему более сложной, чем некоторые другие сообщения здесь, что мне нужно обновить сортировку на основе местоположения пользователей.
Мой сценарий выглядит следующим образом:
У меня есть объект, называемый магазин. Магазин имеет много филиалов, каждая ветвь имеет свой lat/long. У меня есть таблица, которая отображает все ветви для выбранного хранилища. Я хочу, чтобы, когда пользователь обновляет свое местоположение, когда вид таблицы видим, ячейки обновляют свое положение, так что табличное представление сортируется с ближайшей ветвью вверху.
Мне удалось получить все это правильно, если анимация ячейки перемещается вверх и вниз, когда пользователь приближается ближе к ветке и т. Д. Однако мое решение не только неэффективно, но также имеет основную ошибку, когда в tableview есть больше ячеек, чем может поместиться на экране.
Я знаю, что в основном вероятный маршрут вниз - это использование NSOrderedSet для сортировки отношений «многие» на моем объекте Store. Но не уверен, как реализовать это, поскольку значение, которое я сортирую, не хранится в основных данных, но вычисляется динамически, если это имеет смысл. Лат и длинные сохраняются, но расстояние вычисляется на лету и его значение расстояния, которое определяет вид.
В настоящее время я использую протокол CLLocationManger locactionManager: didUpdateLocations для вызова updateCellSortingOrder, который является моим методом сортировки. Менеджеру местоположения присваивается значение:
self.manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
Мой способ сортировки работает, но, как я уже сказал, он не идеален. Я хочу иметь возможность использовать как можно больше основных инструментов данных, таких как NSFetchedViewController, предикаты, агрегаты и т. Д., А не создавать массивы, сортировать их, а затем отталкивать их обратно в FRC и т. Д., Что является своего рода тем, что я делаю сейчас .... все слишком грязно.
Вот мой код, примечания: branchCell подкласс UITableViewCell, который имеет свойство инициализации, который содержит ветвь. Отделение является экземпляром моей сущности Branch
//Creating the branch cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyTableCellView";
BranchCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[BranchCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
Branch *currentBranch = [[self.list.listsToDelivery allObjects] objectAtIndex:indexPath.row];
cell.branch = currentBranch;
cell.textLabel.text = currentBranch.title;
}
return cell;
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
//update the cells
[self updateCellSortingOrder];
}
- (void) updateCellSortingOrder
{
// get the number of cells
static int numberOfCells;
numberOfCells = [[self.currentStore.branches allObjects] count];
//loop though all the cells
for (int cellAIndex = 0; cellAIndex < numberOfCells; cellAIndex++)
{
//set up the cells
static BranchCell * cellA;
static BranchCell * cellB;
//branch instances
static Branch *branchA;
static Branch *branchB;
//distances
static CLLocationDistance distanceA;
static CLLocationDistance distanceB;
static CLLocation *locationA;
static CLLocation *locationB;
//second loop to get the next cell
for (int cellBIndex = cellAIndex+1; cellBIndex < numberOfCells; cellBIndex++)
{
//assign the cells
cellA = (BranchCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:cellAIndex inSection:0]];
cellB = (BranchCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:cellBIndex inSection:0]];
//get the two branches which we need to compate
branchA = cellA.branch;
branchB = cellB.branch;
//calculate the distance
locationA = [[CLLocation alloc] initWithLatitude:branchA.address.region.center.latitude longitude:branchA.address.region.center.longitude];
locationB = [[CLLocation alloc] initWithLatitude:branchB.address.region.center.latitude longitude:branchB.address.region.center.longitude];
distanceA = [self.manager.location distanceFromLocation:locationA];
distanceB = [self.manager.location distanceFromLocation:locationB];
//move the cell a to cell b's location if a's distances is greater than b's
if (distanceA > distanceB)
{
[self.myTableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:cellAIndex inSection:0] toIndexPath:[NSIndexPath indexPathForRow:cellBIndex inSection:0]];
}
}
}
}