1

Я видел много сообщений здесь относительно этой проблемы, но никто, кажется, не решает проблему, которую я испытываю.Сортировка отношений данных ядра со многими в 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]]; 

     } 
    } 
} 
} 

ответ

0

В случае, если какой-либо один сталкивается с теми же вопрос, который я имел, вот мое исправление. Исправлено это некоторое время назад, но никогда не обновлялось. Он был использован в моем приложении Поставляются, который находится на магазин приложений теперь :)

updateCellSortingOrder вызывается методом карта делегат MAPview: didUpdateUserLocation:

  • (аннулируются) updateCellSortingOrder {

    [self.myTableView reloadData];

    [сам.sortedCellArray sortUsingComparator:^(доставка * deliveryA, доставка * deliveryB) {

    CLLocationDistance distanceA; 
    CLLocationDistance distanceB; 
    
    
    distanceA = [[self.mapView userLocation] distanceFromLocation: deliveryA.address]; 
    distanceB = [[self.mapView userLocation] distanceFromLocation: deliveryB.address]; 
    
    if (distanceA > distanceB) 
    { 
    
        return (NSComparisonResult)NSOrderedDescending; 
    } 
    
    return (NSComparisonResult)NSOrderedSame; 
    

    }];

}

Смежные вопросы