2012-11-02 2 views
1
내가 CoreData는 FRC를 사용하여 세포의 순서를 변경하는 방법에 일하고

, 나는이 주문 속성을 사용하고 그에 따라이 업데이트하는 것이 좋습니다 많은 게시물을 가로 질러왔다, 하나 개의 코드는재주문 사용하여 가져 오기가 ResultsController

아래 여기에있다 새 개체를 삽입하는 동안 내가 여기

에 따라 표시 순서를 설정하고 증가해야

하는 코드입니다 그것을

- (void)insertNewObject 
{ 
    Test *test = [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.managedObjectContext]; 

NSManagedObject *lastObject = [self.controller.fetchedObjects lastObject]; 

float lastObjectDisplayOrder = [[lastObject valueForKey:@"displayOrder"] floatValue]; 

[test setValue:[NSNumber numberWithDouble:lastObjectDisplayOrder + 1.0] forKey:@"displayOrder"]; 

} 



- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath 
     toIndexPath:(NSIndexPath *)destinationIndexPath; 
{ 
    NSMutableArray *things = [[fetchedResultsController fetchedObjects] mutableCopy]; 

    // Grab the item we're moving. 
    NSManagedObject *thing = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath]; 

    // Remove the object we're moving from the array. 
    [things removeObject:thing]; 
    // Now re-insert it at the destination. 
    [things insertObject:thing atIndex:[destinationIndexPath row]]; 

    // All of the objects are now in their correct order. Update each 
    // object's displayOrder field by iterating through the array. 
    int i = 0; 
    for (NSManagedObject *mo in things) 
    { 
    [mo setValue:[NSNumber numberWithInt:i++] forKey:@"displayOrder"]; 
    } 

    [things release], things = nil; 

// [managedObjectContext save:nil]; 
    NSError *error = nil; 

    if (![managedObjectContext save:&error]) 
    { 
     NSString *msg = @"An error occurred when attempting to save your user profile changes.\nThe application needs to quit."; 
     NSString *details = [NSString stringWithFormat:@"%@ %s: %@", [self class], _cmd, [error userInfo]]; 
     NSLog(@"%@\n\nDetails: %@", msg, details); 
    } 

    // re-do the fetch so that the underlying cache of objects will be sorted 
    // correctly 

    if (![fetchedResultsController performFetch:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
} 

하지만 100 개 항목이 있고, 그때 중간에서 어느 하나 개의 항목을 삭제 가정 내가 생각하는 displayOrder를 다시 계산해야한다. 이 과정을 (를) 대체 할 수있는 다른 방법이 있나요

감사 란짓

+0

누군가 나를 도와 줄 수 있습니다. – Ranjit

답변

3

왜 당신이 인덱스 번호를 다시 계산해야한다고 생각합니까 ?

항목은 적용한 정렬 순서에 따라 정렬됩니다.

오름차순 정렬 순서를 제공하고 숫자를 제공하면 올바른 정렬을 얻을 수 있습니다. 필요하지 않은 것은 항목을 주문하는 데 사용하는 번호와 배열에있는 항목의 색인 간의 직접적인 관련성입니다. 예 : 주문 번호가

1 2 3 4 

인 경우 다음 가져 와서 정렬하면 순서대로 표시됩니다. 주문 번호가 다를 경우에도 동일한 순서로 표시됩니다.

1 3 5 7 

위치를 기록하지 않고 정렬에만 사용되기 때문에 숫자가 누락되지 않아도 상관 없습니다.

이제 색인을 기준으로 정렬 된 4 개의 항목이 있다고 가정 해 보겠습니다.

1 2 3 4 

지금 당신은 한 적은 항목이 두 번째 항목

1 3 4 

을 삭제,하지만 그들은 같은 순서로 여전히. 끝까지 항목을 추가한다고 가정 해보십시오.

1 3 4 5 

이제 세 번째 위치에있는 항목을 이동하려고한다고 가정 해보십시오. 여기에 또 다른 질문이 있습니다. 왜 순서 인덱스는 정수 여야합니까? 수레를 사용하면 이전 수와 이후 수 사이의 중간 점으로 새 인덱스를 계산하기 쉽다는 것을 알 수 있습니다. 그래서, 제 3 위치에 끝 부분에있는 항목을 이동 한 후,이 순서 인덱스의 모양은 다음과 같습니다

1.0 3.0 3.5 4.0 

어떻게 두 번째 위치에 숫자를 추가하는 방법에 대한. 이 경우 중간 점은 계산하기 쉽습니다.

1.0 2.0 3.0 3.5 4.0 

So. 주문 색인 사용에는 아무런 문제가 없습니다. 정수 일 필요는 없으므로 항목을 삭제할 때 모든 색인을 다시 계산할 필요가 없습니다.

이제는 이러한 부동 소수점 수가 비정상적으로 늘어날 가능성이 있지만 앱의 중단 시간이나 사용자가 약간의 설정이 발생할 것으로 예상되는 업데이트 중에 주기적으로 번호를 다시 매길 수 있습니다.

+0

감사합니다. @Abizern, 저에게이 개념을 설명해 주셔서 감사합니다. – Ranjit

+0

만약 당신이 대답을 이해했다면, 이것이 옳은 일입니다. 첫째, 각 객체가 삽입 될 때 증가해야하는 float 유형의 displayOrder 속성을 취해야합니다. – Ranjit

+0

네, 그게 대부분 제가 말한 것입니다. – Abizern

관련 문제