मैं अपने ऐप के अंदर नई प्रबंधित ऑब्जेक्ट्स बना सकता हूं, एक अलग दृश्य में मेरे पास एक टेबल व्यू है जो मेरे पास मौजूद सभी ऑब्जेक्ट्स दिखाता है।NSFetchedResultsController डेटा रीफ्रेश करें?
जब मैं एक नया प्रबंधित ऑब्जेक्ट (पूरी तरह से अलग दृश्य में) बनाता हूं, तो मैं एक अधिसूचना भेज रहा हूं जो मेरे तालिका दृश्य को नए डेटा के साथ पुनः लोड करने का प्रयास कर रहा है जिसमें मैंने जो नई वस्तु बनाई है, वह शामिल है।
मैं तालिका दृश्य संपादित नहीं कर रहा हूं।
केवल एक प्रबंधित संदर्भ है।
मैं समझ नहीं पा रहा हूं कि मैं क्या गलत कर रहा हूं। अगर मैं ऐप बंद करता हूं और अपनी नई ऑब्जेक्ट को फिर से लॉन्च करता हूं तो टेबल व्यू में होता है। जब मैं अधिसूचना प्राप्त करता हूं, तो मैं पुनः लोडडेटा को कॉल करने की कोशिश कर रहा हूं, और मैंने फिर से लाने का प्रयास किया है, लेकिन मैं जो कुछ भी समाप्त करता हूं वह एक खाली तालिका दृश्य है।
कोड के संदर्भ में, मेरी ListViewController:
@interface MyNotesViewController : UIViewController
{
NSManagedObjectContext * __managedObjectContext;
UITableView * _notesTableView;
MyNotesTableViewDelegate_DataSource * _tableDelegate_DataSource;
}
मेरे viewDidLoad इस तरह दिखता है:
- (void)viewDidLoad
{
[super viewDidLoad];
_tableDelegate_DataSource = [[MyNotesTableViewDelegate_DataSource alloc] init];
_tableDelegate_DataSource.managedObjectContext = __managedObjectContext;
[_notesTableView setDataSource:_tableDelegate_DataSource];
NSError * _coreDataError;
BOOL success = [[_tableDelegate_DataSource fetchedResultsController] performFetch:&_coreDataError];
if(success){
[_notesTableView reloadData];
}
}
मेरी प्रतिनिधि/डेटा स्रोत वस्तु में मेरे पास है:
@interface MyCommutesTableViewDelegate_DataSource : NSObject
<UITableViewDataSource, NSFetchedResultsControllerDelegate>
{
NSManagedObjectContext * __managedObjectContext;
NSFetchedResultsController * __fetchedResultsController;
}
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end
कार्यान्वयन अंश :
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
id <NSFetchedResultsSectionInfo> sectionInfo =
[[__fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"NotesTableViewCell";
NotesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NotesTableViewCell" owner:nil options:nil];
for(id currentObject in topLevelObjects){
if([currentObject isKindOfClass:[UITableViewCell class]]){
cell = (NotesTableViewCell*) currentObject;
break;
}
}
}
// Configure the cell.
Note * _note = [__fetchedResultsController objectAtIndexPath:indexPath];
[...]
return cell;
}
अद्यतन
मैं बस सभी वस्तुओं का अनुरोध करने के लिए, क्योंकि मैं त्वरित सुधार मेरी समस्या पड़ा को वापस लाया गया, और उसके बाद मुझे एहसास हुआ, के बाद:
-(NSFetchedResultsController*)fetchedResultsController{
if(!__fetchedResultsController){
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Note" inManagedObjectContext:__managedObjectContext]];
[request setFetchBatchSize:10];
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
__fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:__managedObjectContext sectionNameKeyPath:nil cacheName:nil];
__fetchedResultsController.delegate = self;
[request release];
}
return __fetchedResultsController;
}
मैं stander UITableView डेटा स्रोत यहाँ तरीकों मैं अपना संदर्भ सहेजता हूं, मेरे fetch अनुरोध का मैंने पहले ऐप लॉन्च पर उपयोग किया था, अब कोई डेटा नहीं देता है, कोई त्रुटि नहीं है लेकिन यह कुछ भी नहीं देता है।
तो मुझे लगता है कि मैं NSFetchResultsController को कार्यान्वित करने के तरीके में कोई समस्या नहीं है। लेकिन जब मैं एक नई वस्तु को सहेजने के बाद अनुरोध वापस नहीं कर सकता हूं?
नोट अगर मैं फिर से लॉन्च करता हूं, तो मैंने अभी भी अपनी सभी ऑब्जेक्ट्स प्राप्त की हैं, जिसमें नए जोड़े गए हैं।
मानक अनुरोध:
-(NSArray*)getNotes{
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:[self managedObjectContext]];
[request setEntity:entity];
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
NSError * coreDataError;
NSArray * fetchedObjects = [[self managedObjectContext] executeFetchRequest:request error:&coreDataError];
[request release];
if(fetchedObjects != nil){
return fetchedObjects;
} else {
NSLog(@"ERR: %@", coreDataError);
return nil;
}
}
मैं एक अधिसूचना मुझे एक नई वस्तु कोर डाटा में जोड़ा गया है बताने के लिए इंतज़ार कर रहा हूँ, और फिर मैं उपरोक्त विधि बोल रहा हूँ और फिर मेरी tableview पर reloadData बुला ...
बेशक आप अपने मामले में _notesTableView को फिर से लोड करना चाहते हैं के लागू। – huesforalice
यह भी न भूलें कि 'NSFetchedResultsController' केवल '-SaveanagedObjectContext' पर कॉल किया जा रहा है 'पर प्रतिक्रिया करेगा। इसलिए यदि आप नव निर्मित इकाई को सहेज नहीं रहे हैं तो आप इस विधि को आग नहीं देख सकते हैं। –
धन्यवाद, मैं नियंत्रक DidChangeContent को कार्यान्वित कर रहा हूं: NSFetchedResultsControllerDelegate प्रोटोकॉल से, मेरे tableview पर reloadData को कॉल करना। मैंने ब्रेकपॉइंट्स जोड़े हैं और इस विधि को बुलाया जा रहा है, लेकिन टेबलव्यू खाली रीलोडिंग है। अगर मैं ऐप को फिर से लॉन्च करता हूं, तो मैं अपने सभी रिकॉर्ड देख सकता हूं जिसमें नया शामिल है। मैं क्या खो रहा हूँ? पीएस: क्या मुझे नियंत्रक को कार्यान्वित करना है: didChangeObject: atIndexPath: forChangeType: newIndexPath? – Daniel