2014-10-30 2 views
1

Краткая версия моей проблемы: я удаляю объект и после того, как сделаю выборку, которая возвращает ранее удаленный объект.Основные данные для извлечения удаленных объектов

Я следую этой архитектуры: SyncService -> Постоянство Сервис -> NSManagedObject

Все мои классы в слое Persistence Service являются дети следующего класса:

# 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 

Перед удалением, я извлечение объекта в моем основном контексте:

# 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]; 
} 
Смежные вопросы