2014-10-30 2 views
1

내 문제의 짧은 버전 : 개체를 삭제하고 이전에 삭제 한 개체를 반환하는 가져 오기를 수행 한 후.코어 데이터 삭제 된 개체를 가져 오는 중

나는이 아키텍처를 다음 해요 :

# PersistenceService.h 
#import <Foundation/Foundation.h> 

@interface PersistenceService : NSObject 

@property (nonatomic, retain) NSManagedObjectContext *context; 

-(instancetype) init; 
-(void) saveContext; 
@end 

# PersistenceService.m 
@implementation PersistenceService 

-(instancetype) init { 
    self = [super init]; 

    if (self) { 
     self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     self.context.parentContext = [DataManager sharedInstance].managedObjectContext; 
    } 

    return self; 
} 

-(void) saveContext { 
    NSManagedObjectContext *context = self.context.parentContext; 

    [self.context performBlock:^{ 

     NSError *error; 
     [self.context save:&error]; 

     [context performBlock:^{ 
      NSError *error; 
      [context save:&error]; 

      [context.parentContext performBlock:^{ 
       NSError *error; 
       [context.parentContext save:&error]; 

      }]; 
     }]; 
    }]; 

} 

@end 

나는, 삭제하기 전에 SyncService - -> 지속성 서비스 지속성 서비스 계층에서> NSManagedObject

내 모든 클래스는 다음 클래스의 자식입니다 내 주요 컨텍스트에서 객체를 가져 오십시오 :

# Synchronizer.m 
-(void) synchronize { 
    NSArray *pseudoLeads = [[[PseudoLeadPersistenceService alloc] init] getAllParentPseudoLeads]; 
    if (pseudoLeads) { 
     PseudoLeadDAO *pseudoLead = [pseudoLeads objectAtIndex:0]; 
     if ([pseudoLead.type isEqualToNumber:[NSNumber numberWithInt:Capture]]) { 
      CaptureSyncService *service = [[CaptureSyncService alloc] initWithDelegate:self andPseudoLead:pseudoLead]; 
      [service executeRequest]; 
     } else { 
      HotleadSyncService *service = [[HotleadSyncService alloc] initWithDelegate:self andPseudoLead:pseudoLead]; 
      [service executeRequest]; 
     } 
    } 
} 

.

# PseudoLeadPersistenceService.m 
-(NSArray *) getAllParentPseudoLeads { 
    return [PseudoLeadDAO findAllParentPseudoLeadsInContext:self.context.parentContext]; 
} 

그리고 여기 내가 가져 실제로 내 서브 컨텍스트에서 개체를 삭제 :

# PseudoLeadPersistenceService.m 
-(void) deletePseudoLeadById:(NSNumber *)pseudoLeadId andEventId:(NSNumber *)eventId { 
    PseudoLeadDAO *pseudoLeadDAO = [PseudoLeadDAO findPseudoLeadById:pseudoLeadId andEventId:eventId inContext:self.context]; 
    [self.context deleteObject:pseudoLeadDAO]; 
    [self saveContext]; 
} 

그런 다음 -(void) synchronize 다시 호출되고 삭제 된 개체는 고장으로 다시 보여줍니다. 이 시점에서 원하는만큼 가져올 수 있으며 반환됩니다. 다시 -(void) deletePseudoLeadById:(NSNumber *)pseudoLeadId andEventId:(NSNumber *)eventId 방법으로 가면 오류가 사라지고 오류가 발 생합니다.

나는 도움을 주셔서 감사합니다. 감사!

답변

0

문제는 동시성 문제입니다. 컨텍스트를 저장하기 시작한 스레드가 다음 가져 오기 전에 완료되지 않았습니다.

:

나는 performBlockAndWait를 사용하여 문제를 해결했다.

# PseudoLeadPersistenceService.m 
-(void) deletePseudoLeadById:(NSNumber *)pseudoLeadId andEventId:(NSNumber *)eventId { 
    PseudoLeadDAO *pseudoLeadDAO = [PseudoLeadDAO findPseudoLeadById:pseudoLeadId andEventId:eventId inContext:self.context]; 
    [self.context deleteObject:pseudoLeadDAO]; 
    [self saveContextAndWait]; 
} 
관련 문제