0

XMBP를 사용하여 FBChat을 만듭니다. coredata 및 fetchedResults에 대해 별도의 클래스를 만들었습니다.핵심 데이터 대리자 메서드가 두 번 이상 호출됩니다.

CoreDataClass :

@implementation CoreDataClass 

@synthesize managedObjectContext = __managedObjectContext; 
@synthesize managedObjectModel = __managedObjectModel; 
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 


- (NSManagedObjectContext *)managedObjectContext 
{ 

    if (__managedObjectContext != nil) 
    { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) 
    { 
     __managedObjectContext = [[NSManagedObjectContext alloc] init] ; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return __managedObjectContext; 
} 


- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (__managedObjectModel != nil) 
    { 
     return __managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Chat" withExtension:@"momd"]; 
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
    return __managedObjectModel; 
} 


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (__persistentStoreCoordinator != nil) 
    { 
     return __persistentStoreCoordinator; 
    } 
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSURL *storeURL = [[delegate applicationDocumentsDirectory] URLByAppendingPathComponent:@"FacebookChat.sqlite"]; 
    NSError *error = nil; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 



    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 
    { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return __persistentStoreCoordinator; 
} 
- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) 
    { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
     { 
         NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 

FetchedControlClass :

@implementation FetchedControllClass 
@synthesize fetchedResultsController; 

#pragma mark Fetched Results 

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    CoreDataClass *coreDataObject=[[CoreDataClass alloc]init]; 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 
    } 


    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Conversation" inManagedObjectContext:coreDataObject.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setFetchBatchSize:20]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"facebookName" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];  
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:coreDataObject.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"] ; 
    [fetchRequest release]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 
    [aFetchedResultsController release]; 
    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    [coreDataObject release]; 
    return fetchedResultsController; 
}  

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    AlertListVC *alertListObject=[[AlertListVC alloc]initWithNibName:@"AlertListVC" bundle:nil]; 

    [alertListObject.tableView beginUpdates]; 
    [alertListObject release]; 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo 
      atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
{ 
    AlertListVC *alertListObject=[[AlertListVC alloc]initWithNibName:@"AlertListVC" bundle:nil]; 


    switch(type) { 
     case NSFetchedResultsChangeInsert: 
      [alertListObject.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [alertListObject.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
    [alertListObject release]; 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath 
{ 
    AlertListVC *alertListObject=[[AlertListVC alloc]initWithNibName:@"AlertListVC" bundle:nil]; 

    UITableView *tableView = alertListObject.tableView; 

    switch(type) { 
     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
      [alertListObject configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
    [alertListObject release]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    AlertListVC *alertListObject=[[AlertListVC alloc]initWithNibName:@"AlertListVC" bundle:nil]; 
    [alertListObject.tableView endUpdates]; 
    [alertListObject release]; 

} 

내가 만든 한 MainChatClass에서 두 클래스 개체 및 ConversationClass

에 coredata에서 대화를 추가
Conversation *conversation = (Conversation *)[NSEntityDescription 
                  insertNewObjectForEntityForName:@"Conversation" 
                  inManagedObjectContext:coreDataClassObject.managedObjectContext]; 

내가 수 있어요 fetchedResults를 얻으려면 문제점은 다음과 같습니다. Coredata 메쏘드는 두 번 caleed되었습니다. 그래서 파일을 두 번 생성합니다. 채팅 할 친구를 선택하면 애플리케이션이 중단됩니다. 문제를 추적하기 위해 좀비를 사용했습니다. 책임 호출자 오류 : 1 MainChatClass있는 tableView : didSelectRowAtIndexPath] 2 NSFetchedResultsController (개인 방법) _managedObjectContextDidChange]

내가 여러 번 시도했지만 여전히 이러한 방법으로 오류를 받고있다. 다음 중 하나라도 도움이된다면 저를 도와주십시오. 미리 감사드립니다.

답변

0

각 FRC 대리인 메서드에서 alertListObject을 새로 만듭니다. 그건 말이 안돼. 업데이트 메시지를 기존 테이블보기로 보내야합니다.

새로 생성 된보기 컨트롤러의 경우 alertListObject.tableViewnil이므로 충돌이 발생합니다.

+0

답장을 보내 주셔서 감사합니다. 가져 오기 컨트롤러에서 기본 클래스에 메소드를 위임하고 문제를 해결했습니다. – Anand

+0

@Anand : 나는 그것을 듣게되어 기쁩니다. 내 대답이 도움이된다면, 대답의 왼쪽에있는 체크 표시를 클릭하여 "동의"해야합니다. –

관련 문제