주 스레드의 목적 c에서 Core 데이터를 사용하면 데드락이 발생합니다. 이것을 관리하기 위해 나는 NSMainQueueConcurrencyType을 사용하고 다른 하나는 NSPrivateQueueConcurrencyType을 사용하는 Managed Object Context를 사용하고 있습니다. 다음은 코드입니다.
- (NSManagedObjectContext *)mainQueueContext
{
if (!_mainQueueContext) {
_mainQueueContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_mainQueueContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
}
return _mainQueueContext;
}
- (NSManagedObjectContext *)privateQueueContext
{
if (!_privateQueueContext) {
_privateQueueContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_privateQueueContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
}
return _privateQueueContext;
}
나는 또한 알림을 설정했습니다-
- (void)contextDidSavePrivateQueueContext:(NSNotification *)notification
{
@synchronized(self) {
[self.mainQueueContext performBlock:^{
[self.mainQueueContext mergeChangesFromContextDidSaveNotification:notification];
}];
}
}
- (void)contextDidSaveMainQueueContext:(NSNotification *)notification
{
@synchronized(self) {
[self.privateQueueContext performBlock:^{
[self.privateQueueContext mergeChangesFromContextDidSaveNotification:notification];
}];
}
}
- (id)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSavePrivateQueueContext:)name:NSManagedObjectContextDidSaveNotification object:[self privateQueueContext]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSaveMainQueueContext:) name:NSManagedObjectContextDidSaveNotification object:[self mainQueueContext]];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
이제 내 문제는 백그라운드 큐의 Core 데이터에서 레코드를 가져 오는 것입니다. 레코드를 가져 오기위한 내 코드는-
-(NSArray *)fetchNameForStr:(NSString *)str
{
NSManagedObjectContext *childContext=[CoreDataStore privateQueueContext];
__block NSArray *array=nil;
[childContext performBlock:^{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:childContext]];
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"(name=%@)", str];
[request setPredicate:predicate];
[request setResultType:NSDictionaryResultType];
NSError *error = nil;
array = [childContext executeFetchRequest:request error:&error];
return array;
}];
return dict;
}
위의 함수는 가져 오기가 비동기 적으로 수행되기 때문에 nil을 반환합니다. 완료 핸들러를 넣는 방법은 무엇입니까? 이 함수에서 반환 할 수있는 결과를 어떻게 얻을 수 있습니까? 같은 방식으로 핵심 데이터에 레코드를 저장하고 있습니다. 저장 및 가져 오기 동기화에도 문제가 있습니까?
이 핵심 데이터 스레드 문제에 갇혀 있습니다. 이것에서 벗어나도록 도와주세요.
비동기 요청을 사용하는 경우 결과를 얻는 가장 간단한 방법은 블록을 인수로 사용하고 반환 유형을 void로 변경하는 것 입니다. 그리고 블록의 끝에서-결과와 함께 인수 블록을 호출하십시오. 이 같은:
typedef void (^ResultBlockType)(NSArray *resultArray, NSError *error);
- (void)fetchNameForStr:(NSString *)str resultBlock:(ResultBlockType)resultBlock {
NSManagedObjectContext *childContext = [CoreDataStore privateQueueContext];
__block NSArray *array = nil;
[childContext performBlock:^{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:childContext]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name=%@)", str];
[request setPredicate:predicate];
[request setResultType:NSDictionaryResultType];
NSError *error = nil;
array = [childContext executeFetchRequest:request error:&error];
resultBlock(array, error)
}];
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다