2013-02-18 50 views
8

Trong fetchedResultsController trong khi thiết lập các NSSortDescriptor iam nhận được lỗi này không được hỗ trợ NSSortDescriptor (khối so sánh không được hỗ trợ).không được hỗ trợ NSSortDescriptor (khối so sánh không được hỗ trợ)

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"Alarm" inManagedObjectContext: managedObjectContext]; 
[fetchRequest setEntity:entity]; 

//Below code is not working and causing error. sorting use the hours&seconds part of the time attribute 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
          initWithKey:@"time" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) { 

            NSCalendar *calendar = [NSCalendar currentCalendar]; 
            NSDateComponents *components1 = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:obj1]; 
            NSDateComponents *components2 = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:obj2]; 
            NSDate *date1 = [calendar dateFromComponents:components1]; 
            NSDate *date2 = [calendar dateFromComponents:components2]; 


            return [date1 compare:date2]; 

          }]; 

Trả lời

8

Bạn không thể sử dụng các bộ mô tả sắp xếp với các khối so sánh ở mọi nơi - ví dụ không phải với các lần tìm nạp dữ liệu lõi.

Chúng hoạt động tốt khi bạn lọc mảng bình thường.

Ngoài ra - có câu hỏi nào ở đó mà tôi bỏ qua không?

+1

Tôi có thể làm gì để nhận được kết quả trên? –

+1

@Anil Vâng, một cách đơn giản có thể là trích xuất tất cả dữ liệu của bạn thành một mảng, sau đó sắp xếp mảng đó với bộ mô tả sắp xếp từ mã của bạn. – Monolo

+2

Tôi đã làm như vậy. Sắp xếp bên ngoài sau khi tìm nạp. Nhưng vấn đề tôi đang sử dụng 'điều khiển: (NSFetchedResultsController *) điều khiển didChangeObject: (id) anObject atIndexPath: (NSIndexPath *) indexPath forChangeType: (NSFetchedResultsChangeType) loại newIndexPath: (NSIndexPath *) newIndexPath' để cập nhật xem bảng. Trong khi thực hiện xóa một số hàng khác tại đường dẫn chỉ mục sẽ bị xóa. –

2

Như Monolo đã nói, bạn không thể sử dụng bộ so sánh chặn với Dữ liệu cốt lõi. Tuy nhiên, bạn có thể sử dụng:

[NSSortDescriptor sortDescriptorWithKey:(NSString *) ascending:(BOOL) selector:(SEL)] 

Bạn sẽ cần phải mở rộng mô hình của mình nếu bạn không sử dụng bộ chọn chuẩn.

Ví dụ, tôi chỉ cần ra lệnh chuỗi "a la Finder" (tức là 1,2,9,10, và không 1,10,2,9) và tôi đã sử dụng

request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:myEntity ascending:NO selector:@selector(localizedStandardCompare:)]]; 

Hãy hãy xem số NSSortDescriptor Class Reference by Apple

Mã hóa hạnh phúc :)

+0

nó không hoạt động trong Dữ liệu chính. Việc sắp xếp xảy ra trong phần phụ trợ SQLite. localizedStandardCompare hoạt động, có lẽ vì nó là một bộ chọn NSString và apple đã làm một cái gì đó để dịch nó so sánh như thế nào. –

+0

Xin lỗi, tôi không hiểu nhận xét của bạn: Tôi đã bắt đầu câu trả lời của mình với "bạn không thể sử dụng bộ so sánh chặn với Dữ liệu cốt lõi", tôi đoán rõ ràng là nó không hoạt động trong Dữ liệu chính ... –

+1

Ý tôi là bộ chọn cũng không hoạt động trên dữ liệu lõi. giống như nếu chúng ta có một '@selector (fancyCompare:)' trên mô hình. Nó không hoạt động với Core Data. –

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