2012-02-28 15 views
9

में किसी NSOrderedSet रिलेशनशिप को पुन: व्यवस्थित नहीं कर सकता है क्या किसी को पता है कि मैं कोर डेटा में NSOrderedSet संबंध में ऑब्जेक्ट्स के क्रम में परिवर्तन क्यों नहीं सहेज सकता? मुझे पहले से ही बग का पता है जहां एनएसओर्डर्डसेट रिश्ते के लिए जेनरेट किए गए कार्यों का उपयोग करना अच्छा काम नहीं करता है, और इसलिए मैं हमेशा कीपैथ का उपयोग करता हूं। नीचे तालिका दृश्य में दो कार्यों के लिए कोड है।कोर डेटा

tableView:moveRowAtIndexPath:toIndexPath: सफलतापूर्वक सहेजने का दावा करता है, लेकिन वास्तव में परिवर्तन सहेजा नहीं गया है, जिसका अर्थ है कि यदि मैं [tableView reloadData]; करता हूं, तो पुराना आदेश अभी भी वहां है। यहां तक ​​कि अगर मैं ऐप से बाहर निकलता हूं और इसे पुनरारंभ करता हूं, तो ऑर्डर नहीं बदला है। मैंने इसे कई एनएसएलॉग के साथ सत्यापित किया है। दूसरा फ़ंक्शन, tableView:commitEditingStyle:forRowAtIndexPath:, जिसे मैं NSOrderedSet प्रविष्टि को हटाने के लिए उपयोग करता हूं, पूरी तरह से काम करता है।

मेरा सिद्धांत यह है कि कोर डेटा एनएसओर्डर्डसेट रिश्ते से अपने आंतरिक प्रतिनिधित्व में ऑर्डर जानकारी को त्याग देता है, और इसलिए क्योंकि ऑब्जेक्ट एक जैसा रहता है, यह आंकड़े देता है कि इसे कुछ भी सहेजने की आवश्यकता नहीं है। क्या किसी ने इससे पहले ऐसा कुछ अनुभव किया है? यदि हां, तो क्या आपको कोई काम मिल गया?

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

संपादित करें: मैं [context save:&savingError] दो बार फोन कर, रिकॉर्ड की एक बार के साथ हटा दिया द्वारा समस्या को हल करने में सक्षम था, और उनके साथ एक बार नए आदेश में पुनः लगाए। हालांकि यह फिक्स वास्तव में आवश्यक नहीं होना चाहिए।

+0

यह शुक्र आईओएस 6 में ठीक किया गया प्रतीत होता है एक बड़ा प्रदर्शन में सुधार इसका मतलब है अगर आप बड़ी वस्तु शफ़ल करने की जरूरत है पेड़। – sobri

+0

क्या आप संपादित हल कोड को पोस्ट कर सकते हैं? मैंने जो कहा, मैंने दो बार बचाया, लेकिन यह काम करने के लिए पर्याप्त नहीं था ... –

+0

यह आईओएस 6 में तय किया गया था? मजेदार यह अभी भी मेरे लिए काम नहीं कर रहा है हाहा! : ') कोर डेटा को मेरे अनुभव में पहले से ही एक बार सामान संपादित करने के लिए बम में दर्द है! इस तरह की एक ही समस्या हल करने के लिए देख रहे हैं! – simonthumper

उत्तर

8

एक सरणी में परिवर्तित करने का कारण क्या है? NSMutableOrderedSet पहले से ही विधि का समर्थन करता है exchangeObjectAtIndex:withObjectAtIndex:

मेरा सुझाव चाहते हैं:

NSMutableOrderedSet *exchange = [playlist.tracks mutableCopy]; 

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

[exchange exchangeObjectAtIndex:fromIndex withObjectAtIndex:toIndex]; 

playlist.tracks = exchange; 

इसके अलावा, आप तो अपने हटाना विधि [track removeBelongingPlaylistObject:playlist]; सब कुछ करने के लिए अपने कॉल के कारण काम करता है, प्लेलिस्ट और ट्रैक के बीच कई रिश्ते के लिए कई है लगता है और विधि में अनावश्यक होना चाहिए (संदर्भ को सहेजने के अलावा)।

2

तेज करने के लिए परिवर्तित @ ikuramedia के कोड देता है:

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

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

playlist.tracks = exchange 

मामले किसी में यह जरूरत