2012-02-28 17 views
9

Çekirdek Veriler'de bir NSOrderedSet ilişkisindeki nesneler sırasındaki değişikliği neden değiştiremediğimi bilen var mı? Bir NSOrderedSet ilişkisi için oluşturulan işlevleri kullanmanın iyi çalışmadığı bir hatayı zaten biliyorum ve bu yüzden her zaman anahtar yolunu kullanıyorum. Aşağıda, bir tablo görünümünde iki işlev için kod bulunmaktadır.Bir Çekirdek Verisinde NSOrderedSet ilişkisini yeniden sıralayamıyor

tableView:moveRowAtIndexPath:toIndexPath: başarıyla kaydedildiğini iddia ediyor, ancak değişiklik aslında kaydedilmiyor, yani bir [tableView reloadData]; gerçekleştirirseniz, eski düzen hala var demektir. Uygulamadan çıkıp yeniden başlatsam bile sipariş değişmedi. Bunu çoklu NSLog'larla birlikte verdim. Bir NSOrderedSet girdisini silmek için kullandığım ikinci işlev, tableView:commitEditingStyle:forRowAtIndexPath:, mükemmel çalışır.

Teorim, Çekirdek Verilerin NSOrderedSet ilişkisinden gelen sipariş bilgilerini dahili gösterimlerinde atar ve bu nedenle nesneler aynı kaldığı için herhangi bir şey kaydetmeye gerek olmadığını gösterir. Daha önce böyle bir şey yaşayan var mı? Eğer öyleyse, bir iş buldunuz mu?

-(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); } 
    } 
} 

DÜZENLEME

: Ben kayıtlar kaldırılır kez olmak üzere iki kez [context save:&savingError] arayarak sorunu çözmek başardı ve bir kez onlarla yeni sırayla reinserted. Bu düzeltme gerçekten gerekli olmamalıdır.

+0

ihtiyacı ağaçlar. – sobri

+0

Düzenlenmiş çözümlenmiş kodu gönderir misiniz, lütfen? Söylediklerinizi yaptım, iki kez kaydetmeyi çağırma, ama bunu yapmak için yeterli değildi ... –

+0

Bu, iOS6'da giderildi mi? Komik hala benim için çalışmıyor haha! : ') Çekirdek Veriler, deneyimlerimde zaten var olan şeyleri düzenlemek için serseride bir acıdır! Buna benzer bir sorunu çözmek için arıyorum! – simonthumper

cevap

8

Diziye dönüştürmenin sebebi nedir? NSMutableOrderedSet zaten yöntemini destekler exchangeObjectAtIndex:withObjectAtIndex:

Ben öneririm: Ayrıca

NSMutableOrderedSet *exchange = [playlist.tracks mutableCopy]; 

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

[exchange exchangeObjectAtIndex:fromIndex withObjectAtIndex:toIndex]; 

playlist.tracks = exchange; 

, bunu da silme yöntemi [track removeBelongingPlaylistObject:playlist]; Herşey için çünkü çağrı çalışır, Oynatma ve Takip arasında birçok ilişki bir çoğu var gibi Başka bir yöntemde gereksiz (bağlamı kaydetme hariç) olmalıdır. Swift için ikuramedia kodunun @ dönüştürme

2

verir: durumda herkes yılında

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

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

playlist.tracks = exchange 

Büyük nesne karıştırmak gerekirse büyük bir performans artışı anlamına Bu minnetle iOS 6'da sabit gibi görünen

İlgili konular