ios – 核心数据并发调试:假阳性

ios – 核心数据并发调试:假阳性,第1张

概述如 WWDC 2014 session 225(核心数据新增内容)所述,iOS 8和OS X优胜美地的核心数据现在支持命令行参数-com.apple.CoreData.ConcurrencyDebug 1,以启用检测到违反Core Data的并发合同的断言. 在我的实验中,我发现它在iOS 8 beta 1(在设备和模拟器中)都可以工作,但是我似乎发现了一个错误的肯定,即框架是抛出一个多线程违规异 如 WWDC 2014 session 225(核心数据新增内容)所述,iOS 8和OS X优胜美地的核心数据现在支持命令行参数-com.apple.CoreData.ConcurrencyDeBUG 1,以启用检测到违反Core Data的并发合同的断言.

在我的实验中,我发现它在iOS 8 beta 1(在设备和模拟器中)都可以工作,但是我似乎发现了一个错误的肯定,即框架是抛出一个多线程违规异常不这样做至少这是我的信仰.

问题:下面的代码是正确的还是我做的事情违反了Core Data的线程模型?

我所做的是设置一个非常简单的核心数据堆栈(使用内存存储,为了简单起见)与托管对象上下文名为backgroundContext与私有队列并发.然后我在该上下文中调用performBlockAnDWait {},并在块中创建一个新的托管对象,将其插入上下文并保存.

保存 *** 作是从Core Data获取多线程冲突异常的地方.

var backgroundContext: NSManagedobjectContext?func setupCoreDataStackAndViolateThreadingContract(){    let objectModelURL = NSBundle.mainBundle().URLForResource("CoreDataDeBUGging",withExtension: "momd")    let objectModel: NSManagedobjectModel? = NSManagedobjectModel(contentsOfURL: objectModelURL)    assert(objectModel)    // Set up a simple in-memory Store (without error handling)    let storeCoordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedobjectModel: objectModel)    assert(storeCoordinator)    let store: NSPersistentStore? = storeCoordinator!.addPersistentStoreWithType(NSInMemoryStoreType,configuration: nil,URL: nil,options: nil,error: nil)    assert(store)    // Set up a managed object context with private queue concurrency    backgroundContext = NSManagedobjectContext(concurrencyType: .PrivateQueueConcurrencyType)    assert(backgroundContext)    backgroundContext!.persistentStoreCoordinator = storeCoordinator!    // Work on the background context by using performBlock:    // This should work but throws a multithreading violation exception on     // self.backgroundContext!.save(&potentialSaveError)    backgroundContext!.performBlockAnDWait {        NSEntityDescription.insertNewObjectForEntityForname("Person",inManagedobjectContext: self.backgroundContext!) as NSManagedobject        person.setValue("John Appleseed",forKey: "name")        var potentialSaveError: NSError?        // In the following line: EXC_BAD_INSTRUCTION in        // `+[NSManagedobjectContext __Multithreading_Violation_AllThatIsleftToUsIsHonor__]:        let dIDSave = self.backgroundContext!.save(&potentialSaveError)        if (dIDSave) {            println("Saving successful")        } else {            let saveError = potentialSaveError!            println("Saving Failed with error: \(saveError)")        }    }}

我已经在Objective-C中基本上测试了相同的代码,并得到相同的结果,所以我怀疑这是一个Swift的问题.

编辑:如果你想自己运行代码,那么I have put a project on GitHub(需要Xcode 6 / iOS 8 beta).

解决方法 苹果确认这是一个错误.它已经用Xcode 6 beta 4修复了. 总结

以上是内存溢出为你收集整理的ios – 核心数据并发调试:假阳性全部内容,希望文章能够帮你解决ios – 核心数据并发调试:假阳性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1097527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存