2014-06-06 107 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一切所以他們是。可以創建另一個子上下文來運行該操作,但直到分析顯示出存在性能問題而無需增加該複雜性。

相關問題