- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新 我可以确认 objectWithID
可能需要父(或祖 parent 等)上下文的线程来进行一些获取,因此避免使用类似 waitUntilAllOperationsAreFinished
。
作为一个快速测试,我将子级 moc 的父级指向其祖级,并让子级线程阻塞原始父级。在此设置中,死锁从未发生。但这是一个糟糕的架构,所以我将重新架构。
原始问题
我有两层NSOperationQueue
。第一个是 NSOperation 图,其中的操作之间具有一组依赖关系。它们都运行良好,彼此之间没有陷入僵局。在其中一个操作(用于多人的调度程序)中,我将其工作分解为可以在另一个 NSOperationQueue 上运行的更离散的 block 。但是,我仍然希望调度程序在较大的操作被视为完成之前完成其所有计划的创建。为此,一旦我创建了所有 Schedule 操作并将它们添加到 Scheduler 操作队列中,我就会在操作队列上调用 waitUntilAllOperationsAreFinished。这就是我陷入僵局的地方。
我正在使用 Core Data,并且有一个名为 BlockOperation
的 NSBlockOperation
子类,它处理获取父托管对象上下文、创建 PrivateQueueConcurrencyType 子上下文、调用提供的例程使用performBlockAndWait 进行阻止,最后等待父上下文合并更改。这是一些代码...
init(block: (NSManagedObjectContext?) -> Void, withDependencies dependencies: Array<NSOperation>, andParentManagedObjectContext parentManagedObjectContext: NSManagedObjectContext?) {
self.privateContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
super.init()
self.queuePriority = NSOperationQueuePriority.Normal
addExecutionBlock({
if (parentManagedObjectContext != nil) {
self.parentContext = parentManagedObjectContext!
self.privateContext.parentContext = parentManagedObjectContext!
self.privateContext.performBlockAndWait({ () -> Void in
block(self.privateContext)
})
self.parentContext!.performBlockAndWait({ () -> Void in
var error: NSError?
self.parentContext!.save(&error)
})
}
})
for operation in dependencies {
addDependency(operation)
}
}
这对我来说已经非常有效了。但现在我想阻塞调用线程,直到其上的操作队列完成其所有操作。像这样...
for group in groups {
let groupId = group.objectID
let scheduleOperation = BlockOperation(
block: { (managedObjectContext: NSManagedObjectContext?) -> Void in
ScheduleOperation.scheduleGroupId(groupId, inManagedObjectContext: managedObjectContext!)
},
withDependencies: [],
andParentManagedObjectContext: managedObjectContext)
scheduleOperationQueue.addOperation(scheduleOperation)
}
scheduleOperationQueue.waitUntilAllOperationsAreFinished()
...该线程卡在最后一行(显然)。但我们从未看到其他线程取得任何超过某一点的进展。暂停调试器,我看到排队操作被卡住的地方。在 ScheduleOperation 的 init 方法中,我们使用提供的 id 获取组。 (ScheduleOperation.scheduleGroupId 调用此 init)
convenience init(groupId: NSManagedObjectID, inManagedObjectContext managedObjectContext: NSManagedObjectContext) {
let group = managedObjectContext.objectWithID(groupId) as Group
...
objectWithID 是否需要在与其父 moc 关联的“父”线程上执行代码,从而导致死锁?我的方法是否还有其他原因可能导致此问题?
注意:虽然我写的是 Swift,但我添加了 Objective-C 作为标签,因为我觉得这不是特定于语言的问题,而是特定于框架的问题。
最佳答案
一般来说,不会指定将在哪个线程上调用 objectWithID
,它是一个实现细节。我过去遇到过一些核心数据死锁问题(尽管在不同的情况下),并且我发现当您调用 NSManagedObjectContext
上的方法时,框架会在内部进行一些锁定。所以是的,我认为这可能会导致僵局。
除了重新设计你的架构之外我没有什么建议,也许它可以简化一点。请记住,您已经有一个与上下文关联的专用串行队列,这保证了将按指定的顺序调用操作。因此,您可以在所有 ScheduleOperation
实例之间共享相同的上下文。将scheduleOperationQueue.maxConcurrentOperationsCount 设置为1,以便操作将依次执行。并且不要阻塞调用线程,而是在最后一个操作完成时调用完成处理程序(您可以使用 oepration 的 completionBlock
)。
关于objective-c - waitUntilAllOperationsAreFinished 和 objectWithID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584789/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!