2014-06-06 108 views
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; 
} 
+0

什么是'self.managedObjectContext',它与'self.objectManager.managedObjectStore.mainQueueManagedObjectContext'有什么关系? – Wain

+0

做了一个编辑。我也应该'self.managedObjectContext = self.objectManager.managedObjectStore.mainQueueManagedObjectContext;'在​​ - (NSFetchedResultsController *)fetchedResultsController' – user1107173

+0

我不知道 - 你没有告诉我他们是什么。可能使用'mainQueueManagedObjectContext'是的。 – Wain

回答

1

它只是看起来像被管理对象上下文无法正确链接,所以你可以使用mainQueueManagedObjectContext一切所以他们是。可以创建另一个子上下文来运行该操作,但直到分析显示出存在性能问题而无需增加该复杂性。

相关问题