0
我有一個間歇性問題。我從模擬器中刪除應用程序並運行Xcode。該應用首次啓動。 RESTkit從服務器下載7個對象(下面的日誌)。然而,NSFetchedResultsController顯示部分計數== 0和的tableview是空RESTkit:NSFetchResultsController不會在首次啓動時更新
2014-06-06 07:14:22.541 App[4859:60b] I restkit.network:RKObjectRequestOperation.m:180 GET 'http://www.domain.com/meetings?lastrequest=2004-06-06T07%3A00%3A00Z'
2014-06-06 07:14:22.772 App[4859:7b03] I restkit.network:RKObjectRequestOperation.m:250 GET 'http://www.domain.com/meetings?lastrequest=2004-06-06T07%3A00%3A00Z' (200 OK/7 objects) [request=0.1917s mapping=0.1528s total=0.2559s]
當我停止應用程序並重新啓動它,我得到3節和7個細胞中的tableView。這就像NSFetchedResultsController第一次沒有被更新。有時候,應用程序會在第一次加載數據。
下面是我的FRC設定:
- (NSFetchedResultsController *)fetchedResultsController
{
if(_fetchedResultsController!=nil)
{
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Meetings"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *firstSort = [[NSSortDescriptor alloc] initWithKey:@"startDate"
ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:firstSort,nil];
[fetchRequest setSortDescriptors:sortDescriptors];
self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@"sectionIdentifier"
cacheName:nil];
self.fetchedResultsController.delegate = self;
return self.fetchedResultsController;
}
FRC代表:
#pragma mark - NSFetchedControllerDelegate
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView reloadData];
[self.tableView endUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
switch (type)
{
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
{
Invite *changedInvite = [self.currentFRC objectAtIndexPath:indexPath];
STInviteSummaryCell *cell = (STInviteSummaryCell *)[self.tableView cellForRowAtIndexPath:indexPath];
[cell updateValuesForChangedInvite:changedInvite];
}
break;
case NSFetchedResultsChangeMove:
{
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
RESTKit取:
RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc]initWithRequest:request responseDescriptors:@[responseDescriptor]];
operation.managedObjectContext = self.objectManager.managedObjectStore.mainQueueManagedObjectContext;
operation.managedObjectCache = appDelegate.managedObjectStore.managedObjectCache;
operation.savesToPersistentStore = NO;
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
//Before saving the objects, here I iterate through the each object in the array and flag each attribute that's changed in the object.
NSError *error;
if ([self.managedObjectContext saveToPersistentStore:&error])
{
NSLog (@"******* OBJECTS SAVED **********");
}
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[SVProgressHUD dismiss];
[self updateUI];
});
}];
[operation start];
[operation waitUntilFinished];
}
同樣的問題是間歇性的。
編輯
在同一個班級,我有以下代碼:
- (void)loadView
{
[self getManagedObjectFromAppDelegate];
[self registerForReachibilityNotificaiton];
[self fetchInvitesInBackgroundThread];
[super loadView];
}
- (void)getManagedObjectFromAppDelegate
{
STAppDelegate *appDelegate = (STAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate setupCoreDataWithRESTKit];
self.objectManager = [self getObjectManager];
self.objectManager.managedObjectStore = appDelegate.managedObjectStore;
self.objectManager.managedObjectStore.managedObjectCache = appDelegate.managedObjectStore.managedObjectCache;
self.managedObjectContext = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
}
什麼是'self.managedObjectContext',它與'self.objectManager.managedObjectStore.mainQueueManagedObjectContext'有什麼關係? – Wain
做了一個編輯。我也應該'self.managedObjectContext = self.objectManager.managedObjectStore.mainQueueManagedObjectContext;'在 - (NSFetchedResultsController *)fetchedResultsController' – user1107173
我不知道 - 你沒有告訴我他們是什麼。可能使用'mainQueueManagedObjectContext'是的。 – Wain