2012-02-28 32 views
9

Có ai biết tại sao tôi không thể lưu thay đổi thứ tự các đối tượng trong mối quan hệ NSOrderedSet trong Dữ liệu chính không? Tôi đã biết về lỗi khi sử dụng các hàm được tạo ra cho mối quan hệ NSOrderedSet không hoạt động tốt và vì vậy tôi luôn sử dụng keypath. Dưới đây là mã cho hai hàm trong một tableview.Không thể sắp xếp lại mối quan hệ NSOrderedSet trong Dữ liệu chính

Yêu cầu tiết kiệm tableView:moveRowAtIndexPath:toIndexPath: để lưu thành công, nhưng thay đổi thực sự không được lưu, có nghĩa là nếu tôi thực hiện [tableView reloadData];, đơn đặt hàng cũ vẫn còn ở đó. Ngay cả khi tôi thoát khỏi ứng dụng và khởi động lại nó, thứ tự vẫn không thay đổi. Tôi đã xác minh điều này với nhiều NSLogs. Hàm thứ hai, tableView:commitEditingStyle:forRowAtIndexPath:, mà tôi sử dụng để xóa một mục nhập NSOrderedSet, hoạt động hoàn hảo.

Lý thuyết của tôi là Dữ liệu cốt lõi loại bỏ thông tin đơn đặt hàng từ mối quan hệ NSOrderedSet trong biểu diễn bên trong của nó và vì vậy các đối tượng vẫn giữ nguyên, nên không cần lưu bất kỳ thứ gì. Có ai có kinh nghiệm bất cứ điều gì như thế này trước đây? Nếu vậy, bạn có tìm được công việc không?

-(void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
{ 

    NSManagedObjectContext *context= [self managedObjectContext]; 

    Playlist *playlist = (Playlist*) [context objectWithID:playlistID]; 


    [playlist willChangeValueForKey:@"tracks"]; 
    NSMutableOrderedSet *exchange = [playlist mutableOrderedSetValueForKey:@"tracks"];; 

    NSInteger fromIndex = sourceIndexPath.row; 
    NSInteger toIndex = destinationIndexPath.row; 

    NSMutableArray *arrayOfTracks = [NSMutableArray arrayWithArray:[exchange array]]; 

    [arrayOfTracks exchangeObjectAtIndex:fromIndex withObjectAtIndex:toIndex]; 
    [[playlist mutableOrderedSetValueForKey:@"tracks"] removeAllObjects]; 


    [[playlist mutableOrderedSetValueForKey:@"tracks"] addObjectsFromArray:arrayOfTracks]; 
    playlist.md5Hash = nil; 
    [playlist didChangeValueForKey:@"tracks"]; 

    NSError *savingError = nil; 
    if ([context save:&savingError]){ 
     NSLog(@"Successfully saved the context for reorder"); 
    } else { 
     NSLog(@"Failed to save the context. Error = %@", savingError); } 

} 


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     NSManagedObjectContext *context= [self managedObjectContext]; 

     Playlist *playlist = (Playlist*) [context objectWithID:playlistID]; 

     Track *track = [self.tracksFRC objectAtIndexPath:indexPath];  


     NSMutableOrderedSet *exchange = [NSMutableOrderedSet orderedSetWithOrderedSet: playlist.tracks]; 


     [exchange removeObject:track]; 
     [track removeBelongingPlaylistObject:playlist]; 
     NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [playlist.tracks count])]; 

     [[playlist mutableOrderedSetValueForKey:@"tracks"] replaceObjectsAtIndexes:indexSet withObjects:[exchange array]]; 

     playlist.md5Hash = nil; 

     NSError *savingError = nil; 
     if ([context save:&savingError]){ 
      NSLog(@"Successfully saved the context for remove entry"); 
     } else { 
      NSLog(@"Failed to save the context. Error = %@", savingError); } 
    } 
} 

EDIT: tôi đã có thể giải quyết vấn đề bằng cách gọi [context save:&savingError] hai lần, một lần với các hồ sơ bị loại bỏ, và một lần với họ reinserted theo thứ tự mới. Sửa chữa này không thực sự cần thiết mặc dù.

+0

này may mắn dường như được cố định trong iOS 6. Có nghĩa là một sự cải thiện hiệu suất lớn, nếu bạn cần phải xáo trộn đối tượng lớn cây. – sobri

+0

Bạn có thể đăng mã đã được chỉnh sửa đã chỉnh sửa không? Tôi đã làm những gì bạn nói, gọi tiết kiệm hai lần, nhưng nó không đủ để làm cho nó hoạt động ... –

+0

Điều này đã được sửa trong iOS6? Hài hước nó vẫn không làm việc cho tôi haha! : ') Dữ liệu cốt lõi là một nỗi đau trong bum để chỉnh sửa công cụ một khi nó đã có trong kinh nghiệm của tôi! Tìm cách để giải quyết một vấn đề tương tự với điều này! – simonthumper

Trả lời

8

Lý do để chuyển đổi thành mảng là gì? NSMutableOrderedSet đã hỗ trợ phương pháp exchangeObjectAtIndex:withObjectAtIndex:

tôi muốn đề nghị:

NSMutableOrderedSet *exchange = [playlist.tracks mutableCopy]; 

NSInteger fromIndex = sourceIndexPath.row; 
NSInteger toIndex = destinationIndexPath.row; 

[exchange exchangeObjectAtIndex:fromIndex withObjectAtIndex:toIndex]; 

playlist.tracks = exchange; 

Ngoài ra, bạn dường như có một nhiều mối quan hệ giữa danh sách nhạc và Track, vì vậy phương pháp xóa của bạn hoạt động vì cuộc gọi của bạn để [track removeBelongingPlaylistObject:playlist]; Tất cả mọi thứ khác trong phương pháp nên được dự phòng (trừ việc lưu ngữ cảnh).

2

Chuyển đổi @ đang ikuramedia để nhanh chóng đưa ra:

var exchange: NSMutableOrderedSet = playlist.tracks.mutableCopy() as! NSMutableOrderedSet 

exchange.exchangeObjectAtIndex(fromIndexPath.row, withObjectAtIndex: toIndexPath.row) 

playlist.tracks = exchange 

Trong trường hợp bất cứ ai cần nó

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