2011-06-30 30 views
5

Tôi có một thực thể CoreData với hai thuộc tính. Một người gọi là 'vị trí' người khác gọi là 'positionChange'. Cả hai đều là số nguyên trong đó thuộc tính position là vị trí hiện tại và positionChange là sự khác biệt giữa vị trí trước đó và vị trí mới. Điều này có nghĩa là positionChange có thể âm.Sắp xếp các thay đổi vị trí dữ liệu lõi với các bộ mô tả sắp xếp cho iPhone

Bây giờ tôi muốn sắp xếp theo vị tríThay đổi. Nhưng tôi muốn nó bỏ qua các giá trị tiêu cực. Hiện tại tôi sắp xếp nó giảm dần, sẽ cho kết quả: 2, 1, 0, -1, -2. Nhưng những gì tôi đang tìm kiếm là có được kết quả này: 2, -2, 1, -1, 0.

Bất kỳ ý tưởng nào về cách giải quyết điều này bằng cách sử dụng các bộ mô tả sắp xếp?


EDIT

tôi có 2 lớp, một lớp gọi là DataManager và khác có chứa loại NSNumber tôi (positionChange là loại NSNumber).

Trong DataManager Tôi có một phương pháp gọi là 'fetchData:', nơi tôi đang thực hiện lấy yêu cầu của tôi với một mô tả loại:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:managedObjectContext]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"positionChange" ascending:NO selector:@selector(comparePositionChange:)]; 
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

tôi đang làm một số công cụ hơn để yêu cầu, nhưng đó không phải là thú vị Cho vấn đề này.

loại

My NSNumber nên giống hệt như một trong những bạn đã đăng: Trong .h:

@interface NSNumber (AbsoluteValueSort) 
- (NSComparisonResult)comparePositionChange:(NSNumber *)otherNumber; 
@end 

Và trong .m:

@implementation NSNumber (AbsoluteValueSort) 

- (NSComparisonResult)comparePositionChange:(NSNumber *)otherNumber 
{ 
    return [[NSNumber numberWithFloat:fabs([self floatValue])] compare:[NSNumber numberWithFloat:fabs([otherNumber floatValue])]]; 
} 

@end 

Khi tôi gọi fetchData trên đối tượng DataManager của tôi Tôi gặp lỗi này:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unsupported NSSortDescriptor selector: comparePositionChange:' 

Mọi ý tưởng về trường hợp này có thể là gì? Tôi đã bao gồm tệp tiêu đề danh mục NSNumber trong lớp DataManager của mình.

+0

Bạn có thể thêm trường 'absolutePositionChange' vào mô hình và điền vào nó (trong setter cho' positionChange', nếu có) với 'abs (positionChange)'? Bạn có thể sử dụng trường đó trong bộ mô tả sắp xếp của bạn. –

Trả lời

2

Hãy thử điều này, giả sử positionChange của bạn là một NSNumber:

@interface NSNumber (AbsoluteValueSort) 

-(NSComparisonResult) comparePositionChange:(NSNumber *)otherNumber; 

@end 

tiếp theo:

@implementation NSNumber (AbsoluteValueSort) 

-(NSComparisonResult) comparePositionChange:(NSNumber *)otherNumber 
{ 
    return [[NSNumber numberWithFloat: fabs([self floatValue])] compare:[NSNumber numberWithFloat: fabs([otherNumber floatValue])]]; 
} 

@end 

và sau đó làm điều này:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"positionChange" ascending:NO selector:@selector(comparePositionChange:)]; 

và sắp xếp với mô tả đó. Nếu bạn muốn thực hiện nó sao cho -2 luôn sau 2 hoặc 5 luôn sau -5 bạn có thể sửa đổi comparePositionChange: trả về NSOrderedAscending trong trường hợp khi một số là số âm của giá trị kia.

+0

Có thể gọi phương thức danh mục giữa các đối tượng không? Ý tôi là bộ mô tả sắp xếp của tôi nằm trong một lớp khác với loại NSNumber. Gọi comparePositionChange: với ví dụ trên của bạn sẽ không hoạt động. Bạn thấy quan điểm của tôi? – Anonymous

+0

Chỉ cần bao gồm bất kỳ tệp nào có danh mục NSNumber trong đó và nó sẽ hoạt động. Danh mục không phải là "trong" bất kỳ lớp nào. – med200

+0

Danh mục nằm trong lớp NSNumber. Gọi nó với ví dụ của bạn sẽ ngụ ý rằng danh mục được thực hiện trong lớp NSSortDescriptor. Nếu không, ứng dụng sẽ sụp đổ với NSInvalidArgumentException với lý do: 'bộ chọn không được hỗ trợ'. Một bao gồm đơn giản sẽ không hoạt động trong trường hợp này. Trừ khi tôi đang làm gì đó sai. Bạn đã thử nghiệm giải pháp của mình chưa? – Anonymous

5

Lý do mã không thành công với lỗi unsupported NSSortDescriptor selector là bạn đang sử dụng kho lưu trữ dữ liệu SQLite và cố gắng sử dụng phương thức Cocoa làm bộ mô tả sắp xếp. Với một kho lưu trữ SQLite, các bộ mô tả sắp xếp được dịch khi đang chạy vào SQL và việc sắp xếp được thực hiện bằng SQLite. Điều đó thực sự giúp hiệu suất nhưng nó cũng có nghĩa là phân loại được thực hiện trong một môi trường không Cocoa, nơi phương pháp so sánh tùy chỉnh của bạn không tồn tại. Sắp xếp như thế này chỉ hoạt động cho các phương thức phổ biến, được biết đến chứ không phải cho mã Cocoa tùy ý.

Sửa lỗi đơn giản là thực hiện tìm nạp mà không cần sắp xếp, lấy mảng kết quả và sắp xếp. Mảng có thể được sắp xếp bằng cách sử dụng bất kỳ phương pháp Cocoa nào bạn muốn, vì vậy danh mục của med200 sẽ hữu ích ở đó.

Bạn cũng có thể thay đổi từ kho lưu trữ dữ liệu SQLite thành một cửa hàng nhị phân, nếu tập dữ liệu của bạn không quá lớn.

Các vấn đề liên quan