다음과 같이 Core Data에 상위 - 하위 - 하위 핵심 데이터 컨텍스트 설정이 있습니다. 나는 손자 컨텍스트에 대한 요청을 페치 실행하려고 할 때마다, 이것은이 교착 상태가 발생 내 코드입니다NSManagedObjectContext - 교착 상태의 원인이되는 하위 컨텍스트
- (NSManagedObjectContext *)defaultPrivateQueueContext
{
if (!_defaultPrivateQueueContext) {
_defaultPrivateQueueContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_defaultPrivateQueueContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
}
return _defaultPrivateQueueContext;
}
- (NSManagedObjectContext *)mainThreadContext {
if (!_mainThreadContext) {
_mainThreadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_mainThreadContext.parentContext = [self defaultPrivateQueueContext];
}
return _mainThreadContext;
}
+ (NSManagedObjectContext *)newPrivateQueueContext
{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.parentContext = [[self sharedParliamentAPI] mainThreadContext];
return context;
}
스레드에서 교착 상태가 발생 (A는 요청을 가져 실행하려고 할 때) :
- (void)fetchMenuItemsWithCompletion:(void (^) (BOOL success, NSString *message))completionBlock {
NSMutableURLRequest *request = [APIHelper createNewRequestWithURLExtension:@"menuitems" httpMethodType:@"GET" parameters:nil];
NSURLSession *session = [NSURLSession sessionWithConfiguration:self.sessionConfig];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSObject *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
if ([[json valueForKey:@"isSuccess"] boolValue]) {
NSManagedObjectContext *defaultContext = self.defaultPrivateQueueContext;
NSManagedObjectContext *privateQueueContext = [ParliamentAPI newPrivateQueueContext];
[privateQueueContext performBlock:^{
__block NSError *error;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"MenuItem"];
NSArray *fetchedRecords = [privateQueueContext executeFetchRequest:request error:&error];
// do stuff with fetchedRecords
}];
} else {
completionBlock([[json valueForKey:@"isSuccess"] boolValue], [json valueForKey:@"message"]);
}
}];
[dataTask resume];
}
'mainThreadContext'는 무엇을 사용합니까? performBlock 또는 performBlockAndWait를 통해 해당 컨텍스트를 사용하는 * everything *이 있습니까? 그렇지 않으면 아이에게 교착 상태가 발생할 수 있습니다. – quellish
이 코드가 실행될 때 mainThreadContext가 사용되지 않습니다. 예, 컨텍스트를 사용하는 모든 것이 performBLock을 통해 수행됩니다 – Lneuner
루트 컨텍스트를 새 하위 컨텍스트의 부모로 설정하고 주 스레드 컨텍스트를 제거하더라도 여전히 교착 상태입니까? – quellish