在iOS 7中管理核心数据线程
在主线程上使用objective c中的核心数据会导致死锁。为了管理这一点,我将使用托管对象上下文,一个使用NSMainQueueConcurrencyType,另一个使用NSPrivateQueueConcurrencyType。这是代码-在iOS 7中管理核心数据线程,ios,objective-c,multithreading,core-data,ios7,Ios,Objective C,Multithreading,Core Data,Ios7,在主线程上使用objective c中的核心数据会导致死锁。为了管理这一点,我将使用托管对象上下文,一个使用NSMainQueueConcurrencyType,另一个使用NSPrivateQueueConcurrencyType。这是代码- - (NSManagedObjectContext *)mainQueueContext { if (!_mainQueueContext) { _mainQueueContext = [[NSManagedObjectContext al
- (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];
}
现在我的问题是从后台队列的核心数据中获取记录。我获取记录的代码是-
-(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。在块的末尾,调用带有result的参数块。大概是这样的:
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)
}];
}
在函数中,您将返回一些任意对象
dict
。那是零,与你的收获无关。是的,我知道。我想知道如何控制它?返回结果,而不是nil对象。嗯。