gpt4 book ai didi

从主队列调用 dispatch_sync 时 iOS 死锁,执行的 block 保存到核心数据

转载 作者:行者123 更新时间:2023-11-28 22:13:47 36 4
gpt4 key购买 nike

我有一个使用父上下文的核心数据实现。我有一个在主队列上运行的主上下文和一个在私有(private)队列上运行的后台上下文,主上下文是他的父级。

我用以下内容覆盖了上下文保存方法:

- (BOOL)save:(NSError **)error {
BOOL retVal = YES;

if (self.parentContext) {
//push changes to parent context.
retVal = [super save:error];

if (retVal) {
//save parent context.
[self.parentContext performBlock:^{
[self.parentContext save:error];
}];
}
} else {
//save changes.
retVal = [super save:error];
}

return retVal;
}

我的问题是当我的主队列调用时:

- (BOOL)doSomething {
__block BOOL retVal;

dispatch_sync(workerQueue, ^{
retVal = [super doSomething];
});

return retVal;
}

如果 [super doSomething] 调用了上下文保存方法,我会遇到死锁(死锁在行中:retVal = [super save:error]; 在我的保存方法中)。

这是工作队列的堆栈跟踪:

0 semaphore_wait_trap
1_dispatch_thread_semaphore_wait$VARIANT$mp
2_dispatch_barrier_sync_f_slow
3_perform
4-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error]
5 -[NSManagedObjectContext save:]

这是主队列的堆栈跟踪:

0 semaphore_wait_trap 
1 _dispatch_thread_semaphore_wait$VARIANT$mp
2 _dispatch_barrier_sync_f_slow
3 [Service doSomething]

出于某种奇怪的原因,这只发生在 iPad 而不是 iPhone

有没有办法使用递归锁来克服这个死锁?

最佳答案

您不得将自己的调度队列用于 Core Data 操作。使用 performBlock:performBlockAndWait: 以确保操作在队列上执行与托管对象上下文关联。

参见 NSManagedObjectContext Class Reference 中的“并发” .

关于从主队列调用 dispatch_sync 时 iOS 死锁,执行的 block 保存到核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22283521/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com